Virtual Connection State Machine State [Unbound] Event [VC-Open] Event_Enqueue_Head([VC-Open)]) State_Change([Bound, Unconnected]) State [Bound, Unconnected] Event [VC-Open] /* An operation involved outgoing communcation was requested for this * virtual connection. Before we can perform such a request, we need * to establish a real connection with the destination process. We * also may need to initialize at least the receive side state machine * now so that any unexpected incoming packets arriving shortly after * connection establishment are properly handled. We could intialize * send state machine, but it can't actually start sending until the * connection has been established. */ initialize send and recv state machines initiate connection establishment XXX - we need one or more method functions for performing the above stated tasks State_Change([Connecting], [initiate connection]) State [Connecting] XXX - we an mechanism for signalling the success or failure of the connection establishment Event [Success] /* * Connection establishment was successful. Now we need to sure the * send state machine gets started (or moved out a "connection * pending" state). */ State_Change([Connected]); Event [Error] /* * Connection establishment failed. Too bad...we assume that the * method has already worn itself out trying to make this connection * happen, so we are just going to admit failure and give up. */ State_Change([Failed]); State [Connected] Event [VC-Close] XXX - we need a way to make a close request /* * A connection close has been requested. At the moment, we only * envision this happening when communicator spanning multiple process * groups is destroyed. The requesting routine should ensure that all * outstanding requests are satisfied or cancelled before making a * close request. Since the destruction of a communicator is a * collective operation, meeting this requirement shouldn't be * difficult. */ close real connection signal State_Change([Bound, Unconnected],[close connection]) Event [Error] /* * The connection fell over. At the moment, this is a permanent * failure. Some additional states would need to be added here and * to the send and recv state machines in order to handle * connection re-establishment. */ State_Change([Failed]); State [Failed] /* * At the moment, virtual connection failures are permanent. */