00001 00006 /*----------------------------------------------------------------------------*/ 00007 /* C Tool Box: Designed and implemented by: */ 00008 /* Walter F.J. Mueller Gesellschaft fuer Schwerionenforschung (GSI) */ 00009 /* Planckstrasse 1, D-64291 Darmstadt, Germany */ 00010 /* Email: W.F.J.Mueller@gsi.de */ 00011 /* WWW: http://www-kp3.gsi.de/www/kp3/people/mueller.html */ 00012 /*------------------------------------------+---------------------------------*/ 00013 00014 #include <assert.h> 00015 00016 //------------------------------------------+----------------------------------- 00018 00019 inline CTBsignalEmitter::CTBsignalEmitter() 00020 : m_ehead() 00021 {} 00022 00023 //------------------------------------------+----------------------------------- 00025 00026 inline CTBsignalEmitter::CTBsignalEmitter( 00027 const CTBsignalEmitter&) 00028 : m_ehead() 00029 {} 00030 00031 //------------------------------------------+----------------------------------- 00033 00034 inline void CTBsignalEmitter::operator()(CTBuint32 i_mask) 00035 { 00036 if (m_ehead) Execute(i_mask); 00037 return; 00038 } 00039 00040 //------------------------------------------+----------------------------------- 00042 00043 inline CTBsignalEmitter& CTBsignalEmitter::operator=( 00044 const CTBsignalEmitter&) 00045 { 00046 return *this; 00047 } 00048 00049 //------------------------------------------+----------------------------------- 00051 00052 inline bool CTBsignalEmitter::operator! () const 00053 { 00054 return !m_ehead; 00055 } 00056 00057 //------------------------------------------+----------------------------------- 00059 00060 inline CTBsignalEmitter::operator bool () const 00061 { 00062 return m_ehead; 00063 } 00064 00065 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00067 00068 inline CTBsignalReceiverBase::CTBsignalReceiverBase() 00069 : m_rhead(), 00070 m_phead(), 00071 mi_nblock(0) 00072 {} 00073 00074 //------------------------------------------+----------------------------------- 00076 00077 inline CTBsignalReceiverBase::CTBsignalReceiverBase( 00078 const CTBsignalReceiverBase& rhs) 00079 : m_rhead(), 00080 m_phead(), 00081 mi_nblock(0) 00082 { 00083 operator=(rhs); 00084 } 00085 00086 //------------------------------------------+----------------------------------- 00088 00089 inline void CTBsignalReceiverBase::Block() 00090 { 00091 mi_nblock += 1; 00092 return; 00093 } 00094 00095 //------------------------------------------+----------------------------------- 00097 00098 inline void CTBsignalReceiverBase::Unblock() 00099 { 00100 assert(mi_nblock > 0); // !?! should be blocked ! 00101 00102 mi_nblock -= 1; 00103 if (mi_nblock == 0) Deliver(); 00104 return; 00105 } 00106 00107 //------------------------------------------+----------------------------------- 00109 00110 inline bool CTBsignalReceiverBase::Blocked() const 00111 { 00112 return mi_nblock > 0; 00113 } 00114 00115 //------------------------------------------+----------------------------------- 00117 00118 inline bool CTBsignalReceiverBase::Pending() const 00119 { 00120 return m_phead; 00121 } 00122 00123 //------------------------------------------+----------------------------------- 00125 00126 inline bool CTBsignalReceiverBase::operator! () const 00127 { 00128 return !m_rhead; 00129 } 00130 00131 //------------------------------------------+----------------------------------- 00133 00134 inline CTBsignalReceiverBase::operator bool () const 00135 { 00136 return m_rhead; 00137 } 00138 00139 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00140 00141 //------------------------------------------+----------------------------------- 00143 00144 inline void CTBsignalLink::Mark() 00145 { 00146 mi_nbusy += 1; 00147 return; 00148 } 00149 00150 //------------------------------------------+----------------------------------- 00152 00153 inline void CTBsignalLink::Unmark() 00154 { 00155 assert(mi_nbusy > 0); // !?! should be busy 00156 mi_nbusy -= 1; 00157 return; 00158 } 00159 00160 //------------------------------------------+----------------------------------- 00162 00163 inline bool CTBsignalLink::Busy() const 00164 { 00165 return mi_nbusy > 0; 00166 } 00167 00168 //------------------------------------------+----------------------------------- 00170 00171 inline bool CTBsignalLink::Pending() const 00172 { 00173 return m_plink; 00174 } 00175 00176 //------------------------------------------+----------------------------------- 00178 00179 inline bool CTBsignalLink::Zombie() const 00180 { 00181 return !m_elink || !m_rlink; 00182 } 00183 00184 //------------------------------------------+----------------------------------- 00186 00187 inline bool CTBsignalLink::Deletable() const 00188 { 00189 return Zombie() && !Busy() && !Pending(); 00190 } 00191 00192 //------------------------------------------+----------------------------------- 00194 00195 inline void CTBsignalLink::UnlinkEmitter() 00196 { 00197 if (m_elink) m_elink.Remove(&CTBsignalLink::m_elink); 00198 return; 00199 } 00200 00201 //------------------------------------------+----------------------------------- 00203 00204 inline void CTBsignalLink::UnlinkReceiver() 00205 { 00206 if (m_rlink) m_rlink.Remove(&CTBsignalLink::m_rlink, 00207 &CTBsignalReceiverBase::m_rhead); 00208 if (m_plink) m_plink.Remove(&CTBsignalLink::m_plink); 00209 return; 00210 } 00211