‟overcq”

Z bloga o OUX/C+

Wywołania procesu OUX

Programy pisane w technologii OUX mają wbudowaną obsługę wywołań procesu dokonywanych z innego procesu OUX. Dzięki temu można łatwo zaimplementować program będący serwerem procedur i program będący klientem procedur; jak to zostało zrobione w programie “current-system-integrator”.

Przychodzące wywołania

Każdy program w technologii OUX zawiera procedurę

void
E_flow_Q_process_call_I_func( P data
){
}

Jest ona wykonywana dla przychodzącego wywołania procesu OUX. Jedyny parametr zawiera adres do pamięci współdzielonej, która zawiera dane przekazane przez program wywołujący. Zawartość tej pamięci może być zmodyfikowana przed powrotem z procedury “E_flow_Q_process_call_I_func” i w ten sposób dane są przekazywane zwrotnie programowi wywołującemu.

Wychodzące wywołania

By wywołać proces innego programu OUX, trzeba utworzyć obiekt “process_call”:

P data;
I call_id = E_flow_Q_process_call_M( l, &data );

Pierwszy parametr zawiera rozmiar żądanej pamięci współdzielonej pomiędzy procesami, drugi parametr to adres zmiennej, której zostanie przypisany adres tej utworzonej pamięci współdzielonej. Natomiast procedura ta w przypadku niepowodzenia wraca z wartością ~0, a w przeciwnym przypadku – z identyfikatorem obiektu “process_call”.

Od tego momentu można dowolną liczbę razy wywoływać inny program lub programy OUX, zważając na to, by nie nadpisywały sobie danych w pamięci współdzielonej. Używa się do tego celu procedury

B successful;
E_flow_Q_process_call_I( call_id, server_pid, &successful );

Pierwszy parametr zawiera identyfikator utworzonego obiektu “process_call”, drugi parametr – identyfikator procesu w systemie operacyjnym przynależący do uruchomionego innego programu OUX, a trzeci – adres zmiennej, której zostanie przypisana wartość boolean powodzenia lub niepowodzenia wykonania wywołania programu OUX. Trzeba tutaj zaznaczyć, że jest to powodzenie lub niepowodzenie wynikające z odebrania przez inny program OUX wywołania, a nie z wykonania czegoś w wyniku tego wywołania. Rezultat wykonania jest na przykład ustawiany w pamięci współdzielonej przez program wywołany.

Jeżeli procedura “E_flow_Q_process_call_I” wróci z wartością yes, to należy zakończyć pętlę zadania, w którym jest ona wykonywana.

Po zakończeniu jednego lub serii wywołań należy wyrzuć obiekt “process_call” procedurą

E_flow_Q_process_call_W( call_id );