In this section, we use the Msg library to
implement a Remote Procedure Call module,
RPC.pm. The idea of RPC is to transparently
invoke a subroutine in another process space and have it behave
exactly as if it had been invoked in its own process. The following
are the features we take for granted while calling ordinary
subroutines, which the
RPC module takes into
waits until the called procedure finishes. The RPC module invokes
to get this blocking behavior.
A Perl subroutine can take any number of parameters of any type (including references to objects, complex data structures, and subroutines). The RPC module uses the FreezeThaw module described in Chapter 10, for marshalling parameters: all parameters are flattened and encoded into a single string (frozen) and recovered on the other side (thawed). This means that all data structures sent by reference are copied in their entirety so that the receiving subroutine on the other side can get a reference to an object (as it would if it were in the same process). FreezeThaw — and hence RPC — does not account for code references, because there is no way (in Perl) to decode a code reference and get the subroutine text (because it could be compiled into machine code). We could create a dummy subroutine on the remote side and have it make a nested RPC invocation back to the real code reference, but the current implementation does not ...