Example program of a Remote Object Manager ------------------------------------------ A powerful and convenient way of designing a multitask system is to use "Object oriented programming". It means that for a data object, or physical object, you write a bunch of procedures for performing operations on that object. Pretty simply, really. You've probably done it. In a real-time system, as well as a bunch of procedures, you probably want a controlling program which runs as an independent process, with overall responsability for the object. The smart step is to make some of the operations on the object available to other processes by rpc. +---------------+ | Controlling | | program | +---------------+ +---------------+ | remote | | | program | | +---------------+ | / | / | ______________________/ | / (RPC) | / |/ +---------------+ | Access | | procedures | +---------------+ | database &/or physical object The access procedures are linked with the main program, and share its data structures. The main program also controls when external programs are allowed to call the access routines. - The remote program uses the acces routines like any other routine - The control program can enable or disable access from outside for exclusive access to the object. - The access routines may affect data structures, and synchonisation primitives, and so modify the main program behaves. (For instance, access routine can release the main program from a wait state). In this example two instances of the same program communicate in this way, to implement a simple game of battelships. Each program manages an object which is a fleet of ships. +---------------+ +---------------+ | Progam 1 | | Program 2 | +---------------+ +---------------+ |\ / | | \ / | | \__________ / | | \ / | | ___________\__________/ | | / rpc \ | | / \_____________ | |/ rpc \| +---------------+ +---------------+ | Access | | Access | | procedures | | procedures | +---------------+ +---------------+ | | | | Fleet 1 Fleet 2 The program provides two access functions for this object: o "Declare war" o "Fire at me" which are accesible remotely. This inter-module interface is described by the declaration files MY_ARTILLERY.RPC and HIS_ARTILLERY.RPC. [The local and remote versions are named differently to avoid a clash of symbol names, so that they can be distinguished in the program. The two interfaces are otherwise identical, and are cross-coupled when the rpc addresses are defined] The example is written in VAX/Pascal (to be easy to write) but should be intelligible to those used to other langauges. (If you are not used to Pascal, remember that it is best read backwards, as the main program is at the bottom and the little routines at the top!). The program is not written to be portable. FILES These are available on VXCERN::DISK$D1:[RPC.EXAMPLES.BATTLESHIPS] BATTLESHIPS.IPA is the source code BATTLESHIPS.COM is the command file to run it MY_ARTILLERY.RPC } HIS_ARTILLERY.RPC } are the RPC package definitions DESCRIP.MMS describes how to build it under MMS BATTLESHIPS.EXE is the executable image created by MMS To Run the example, you need two Vt220 terminals, two processes and SYSNAM privilege (which you don't get on VXCERN). Run the command file from each terminal. DISCLAIMER The game is based on the one I used to play with my father when I was small, with a few changes. The main change is that you don't have to take it in turns to fire, you can fire at will. This is less fair, but demonstrates the asynchrounous, multithreaded nature of the system. The other change is that, to save time, the program lays out your fleet for you in a random way rather than giving you the chance to hide your ships in funny places. Complaints about the rules of the game are not accepted: it is primarily a demonstration of RPC! Queries about RPC to VXCERN::TIMBL.