7.5.2. Remote Procedure Call

RPC je běžné, proxy na klientovi i dispatcheru na serveru se říká stub, servery mají interface definovaný v IDL, každý interface ma UUID a seznam metod, syntaxe zhruba:

[uuid (12345678-9ABC-DEF0-1234-56789ABCDEF0), version (1.0)]
interface Foo
{
  [context_handle] void *Bar ([in] long X, [out] long *Y);
  [idempotent] void Rab ([in, ref, string] char *A);
};

UUID is an identifier that is universally unique (128 bits, standardized by X.667 or RFC 4122, generated with limited coordination by relying on combinations of network address and time, on random numbers, or on hashes of other unique identifiers).

Zajimave jsou snad atributy idempotent (rika ze je bezpecne pouzit at least once misto at most once semantics), broadcast (rika ze operaci maji vykonat vsechny viditelne servery, ktere ji umi, vraci se prvni vysledek), maybe (rika ze se nemusi zarucovat vykonani operace). U pointeru se da uvest, jestli je reference (nesmi byt NULL, nesmi se menit uvnitr volani) nebo pointer (muze byt NULL, muze se zmenit a budou spravne vracena nova data). Jako typ se da uvest pipe pro prenos streamu dat, potom smer argumentu urcuje push nebo pull pipe, argument se namapuje jako struktura s metodami pull (buffer), push (buffer), alloc (size), klient si je pak implementuje jak potrebuje, server podle typu pipe vola bud pull nebo push, ktere se doruci zpet na klienta. Jen nejde kombinovat vice pipes, tedy jde, ale musi se vyprazdnovat jedna po druhe :-).

Krom kontaktovani serveru pomoci stringove formy object reference je k dispozici directory service s automatickym, implicitnim a explicitnim binding. Automaticke binding spoji klienta s nejblizsim kompatibilnim serverem, implicitni binding dovoli klientovi uvest binding handle v globalni promenne a pouzivat jej pro vsechna volani daneho interface, explicitni binding dovoli klientovi uvadet handle pro kazde volani daneho interface explicitne.

Server vypada normalne, pri startu musi registrovat kazdy podporovany interface volanim rpc_server_register_if (iface_handle ...), registrovat se u directory service pomoci rpc_ns_binding_export (name ...), registrovat svuj endpoint pomoci rpc_ep_register (...), zavolat smycku dispatcheru pomoci rpc_server_listen (...). Pokud chceme uvazovat objektove RPC, je potreba kazdeu objektu priradit UUID a registrovat o neco sloziteji, skipped.