| // umlrtprotocol.hh |
| |
| /******************************************************************************* |
| * Copyright (c) 2015 Zeligsoft (2009) Limited and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| *******************************************************************************/ |
| |
| #ifndef UMLRTPROTOCOL_HH |
| #define UMLRTPROTOCOL_HH |
| |
| #include "umlrtcommsport.hh" |
| #include "umlrtqueueelement.hh" |
| #include "umlrthashmap.hh" |
| #include <stdlib.h> |
| |
| // UMLRTProtocol - base type for port protocols. |
| |
| // Basic operations are put() and get(). The implementation is a LIFO queue. |
| |
| class UMLRTCapsuleId; |
| class UMLRTHashMap; |
| |
| class UMLRTProtocol |
| { |
| public: |
| // Turn port bindin notification on or off. |
| void bindingNotification( bool on ); |
| |
| // Return whether port notification is turned on for this port. |
| bool bindingNotificatioRequested() const; |
| |
| // De-register this SAP port. |
| bool deregisterSAP(); |
| |
| // De-register this SPP port. |
| bool deregisterSPP(); |
| |
| // Get service port registration name. |
| const char * getRegisteredName() const; |
| |
| // Find the smallest replication index connected to the far-end capsule. |
| int indexTo( const UMLRTCapsule * capsule ) const; |
| |
| // Return true of port instance is bound. |
| bool isBoundAt( int index) const; |
| |
| // Return true if far-end capsule is bound to port instance. |
| bool isIndexTo( int index, const UMLRTCapsule * capsule ) const; |
| |
| // Return true if the service port is registered. |
| bool isRegistered() const; |
| |
| // Empty the defer queue associated with all port instances. Returns # of messages deleted. |
| int purge(); |
| |
| // Empty the defer queue for a port instance. Return # of messages deleted. |
| int purgeAt( int index ); |
| |
| // Recall a deferred message from one of all instances. Returns the number of recalled messages. |
| int recall(); |
| |
| // Recall all messages from all port instances. Returns the number of recalled messages. |
| int recallAll(); |
| |
| // Recall all messages from a single port instance. Returns the number of recalled messages. |
| int recallAllAt( int index, bool front = false ); |
| |
| // Recall all messages to the front of the queue. Returns the number of recalled messages. |
| int recallAllFront(); |
| |
| // Recall a message on a port instance. Returns the number of recalled messages (0 or 1). |
| int recallAt( int index, bool front = false ); |
| |
| // Recall the first deferred message on a port instance. Returns the number of recalled messages (0 or 1). |
| int recallFront(); |
| |
| // Register this SAP port with the RTS to allow dynamic binds from SPPs. Return true for success. |
| bool registerSAP( const char * service ); |
| |
| // Register this SPP port with the serivce SAPs. Return true for success. |
| bool registerSPP( const char * service ); |
| |
| // Return the replication factor of the port. |
| size_t size() const { return srcPort->numFarEnd; } |
| |
| static bool deregisterSppPort( const UMLRTCommsPort * sppPort ); |
| static bool deregisterSapPort( const UMLRTCommsPort * sapPort ); |
| static bool registerSppPort( const UMLRTCommsPort * sppPort, const char * service ); |
| static bool registerSapPort( const UMLRTCommsPort * sapPort, const char * service ); |
| static bool isRegistered( const UMLRTCommsPort * port ); |
| |
| // Debugging |
| static void debugOutputServiceRegistration(); |
| |
| private: |
| struct UnboundSapPort : public UMLRTQueueElement |
| { |
| UnboundSapPort( const UMLRTCommsPort *srcPort ) : port(srcPort) { } |
| const UMLRTCommsPort * port; |
| }; |
| |
| static void addSapToQueue( const char * service, const UMLRTCommsPort * sapPort ); |
| static void bindQueuedSapsToSpp( const UMLRTCommsPort * sppPort ); |
| static void completeRegistration( const UMLRTCommsPort * port, const char * service ); |
| static void completeDeregistration( const UMLRTCommsPort * port ); |
| static UMLRTHashMap * getNameToSppPortMap(); |
| static UMLRTHashMap * getNameToUnboundSapPortsMap(); |
| static UMLRTHashMap * getPortToNameMap(); |
| static void removeSapFromQueue( const UMLRTCommsPort * sapPort ); |
| static bool removeSapFromQueueMatchCompare( UnboundSapPort * element, const UMLRTCommsPort * port ); |
| static void removeSapFromQueueMatchNotify( UnboundSapPort * element, const UMLRTCommsPort * port ); |
| |
| static void debugOutputPortToNameMap(); |
| static void debugOutputNameToSppPortMap(); |
| static void debugOutputNameToUnboundSapPortsMap(); |
| static bool debugOutputQueuedSap( UnboundSapPort * unboundSapPort, const char * service ); |
| |
| static UMLRTHashMap * portToName; |
| static UMLRTHashMap * nameToSppPort; |
| static UMLRTHashMap * nameToUnboundSapPorts; |
| |
| protected: |
| UMLRTProtocol( const UMLRTCommsPort * srcPort_ ) : srcPort(srcPort_) { } |
| const UMLRTCommsPort * const srcPort; |
| }; |
| |
| #endif // UMLRTPROTOCOL_HH |