00001 #ifndef _CTBsignalBase_HXX 00002 #define _CTBsignalBase_HXX 1 00003 00008 /*----------------------------------------------------------------------------*/ 00009 /* C Tool Box: Designed and implemented by: */ 00010 /* Walter F.J. Mueller Gesellschaft fuer Schwerionenforschung (GSI) */ 00011 /* Planckstrasse 1, D-64291 Darmstadt, Germany */ 00012 /* Email: W.F.J.Mueller@gsi.de */ 00013 /* WWW: http://www-kp3.gsi.de/www/kp3/people/mueller.html */ 00014 /*------------------------------------------+---------------------------------*/ 00015 00016 #include "CTBsimpleList.hxx" 00017 #include "CTBtreeList.hxx" 00018 00019 class CTBsignalLink; 00020 class CTBsignalReceiverBase; 00021 00022 class CTBsignalEmitter { 00023 00024 friend class CTBsignalLink; 00025 friend class CTBsignalReceiverBase; 00026 00027 public: 00028 00029 CTBsignalEmitter(); 00030 CTBsignalEmitter(const CTBsignalEmitter& rhs); 00031 00032 ~CTBsignalEmitter(); 00033 00034 int NConnect() const; 00035 00036 void operator()(CTBuint32 i_mask); 00037 00038 CTBsignalEmitter& operator=(const CTBsignalEmitter& rhs); 00039 00040 bool operator! () const; 00041 00042 operator bool() const; 00043 00044 private: 00045 00046 void Execute(CTBuint32 i_mask) const; 00047 00048 private: 00049 00050 typedef CTBsimpleListHead<CTBsignalLink> ehead_t; 00051 00052 ehead_t m_ehead; 00053 }; 00054 00055 //------------------------------------------+----------------------------------- 00056 00057 class CTBsignalReceiverBase { 00058 00059 friend class CTBsignalLink; 00060 friend class CTBsignalEmitter; 00061 00062 public: 00063 00064 CTBsignalReceiverBase(); 00065 CTBsignalReceiverBase(const CTBsignalReceiverBase& rhs); 00066 00067 virtual ~CTBsignalReceiverBase(); 00068 00069 int NConnect() const; 00070 void Disconnect(); 00071 void Disconnect(CTBsignalEmitter& emitter); 00072 00073 void Block(); 00074 void Unblock(); 00075 bool Blocked() const; 00076 bool Pending() const; 00077 00078 void Deliver(); 00079 00080 CTBsignalReceiverBase& operator=(const CTBsignalReceiverBase& rhs); 00081 00082 bool operator! () const; 00083 00084 operator bool() const; 00085 00086 protected: 00087 00088 void Connect(CTBsignalEmitter& emitter, 00089 void* p_emitter, CTBuint32 i_mask); 00090 00091 virtual void Execute(void* p_emitter, CTBuint32 i_mask) const = 0; 00092 00093 protected: 00094 00095 typedef CTBtreeListHead<CTBsignalReceiverBase,CTBsignalLink> rhead_t; 00096 typedef CTBsimpleListHead<CTBsignalLink> phead_t; 00097 00098 rhead_t m_rhead; 00099 phead_t m_phead; 00100 int mi_nblock; 00101 }; 00102 00103 //------------------------------------------+----------------------------------- 00104 00105 class CTBsignalLink { 00106 00107 friend class CTBsignalEmitter; 00108 friend class CTBsignalReceiverBase; 00109 00110 private: 00111 00112 CTBsignalLink(CTBsignalEmitter& emitter, 00113 CTBsignalReceiverBase& receiver, 00114 void* p_emitter, CTBuint32 i_mask); 00115 CTBsignalLink(const CTBsignalLink& rhs, 00116 CTBsignalReceiverBase& receiver); 00117 00118 ~CTBsignalLink(); 00119 00120 void Mark(); 00121 void Unmark(); 00122 00123 bool Busy() const; 00124 bool Pending() const; 00125 bool Zombie() const; 00126 bool Deletable() const; 00127 00128 void UnlinkEmitter(); 00129 void UnlinkReceiver(); 00130 00131 private: 00132 00133 typedef CTBsimpleListLink<CTBsignalLink> elink_t; 00134 typedef CTBtreeListLink<CTBsignalReceiverBase,CTBsignalLink> rlink_t; 00135 typedef CTBsimpleListLink<CTBsignalLink> plink_t; 00136 00137 elink_t m_elink; 00138 rlink_t m_rlink; 00139 plink_t m_plink; 00140 int mi_nbusy; 00141 void* mp_emitter; 00142 CTBuint32 mi_acceptmask; 00143 CTBuint32 mi_pendingmask; 00144 }; 00145 00146 // Notes: 00147 // -- proofed: 07-nov-1999(2) 00148 00149 #if !(defined(CTB__OutLine) || defined(CTBsignalBase__OutLine)) 00150 #include "CTBsignalBase.icc" 00151 #endif 00152 00153 #endif 00154 00155 00156 00157 00158 00159 00160 00161 00162 00163 00164