00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _SigHandlersList_h
00016 #define _SigHandlersList_h
00017
00018 #include <signal.h>
00019 #include <errno.h>
00020 #include <sys/time.h>
00021 #include <sys/types.h>
00022
00023 #include "assa/SigHandler.h"
00024
00025 #include <set>
00026 using std::set;
00027
00028 namespace ASSA {
00029
00030 #if !defined(WIN32)
00031
00044 class CFUNC_Handler : public EventHandler
00045 {
00046 public:
00047 CFUNC_Handler (C_SIG_HANDLER csigh_);
00048
00049 int handle_signal (int signum_);
00050 C_SIG_HANDLER handler () { return m_c_sig_hand; }
00051
00052 private:
00053 C_SIG_HANDLER m_c_sig_hand;
00054 };
00055
00065 class SigHandlersList
00066 {
00067 public:
00068 typedef EventHandler* key_type;
00069 typedef EventHandler* data_type;
00070
00071 struct CompSHL {
00072 bool operator () (const key_type c1_, const key_type c2_) const
00073 {
00074
00075
00076
00077 return (c1_ < c2_);
00078 }
00079 };
00080
00081 typedef set< key_type, CompSHL > set_t;
00082 typedef set< key_type, CompSHL >::iterator iterator;
00083
00087 static SigHandlersList* instance (int signum_);
00088
00090 ~SigHandlersList ();
00091
00093 bool empty () const;
00094
00096 size_t size () const;
00097
00101 bool insert (data_type data_);
00102
00105 void erase (const key_type key_);
00106
00110 void erase (iterator it_);
00111
00114 void erase ();
00115
00118 iterator begin ();
00119
00122 iterator end ();
00123
00127 iterator find (const key_type key_);
00128
00134 CFUNC_Handler* cfunc_handler (CFUNC_Handler* cfp_);
00135
00139 CFUNC_Handler* cfunc_handler () const;
00140
00144 void seen_cfunc_handler (bool ft_);
00145
00149 bool seen_cfunc_handler () const;
00150
00151 protected:
00152 SigHandlersList ();
00153 SigHandlersList (const SigHandlersList& map_);
00154 SigHandlersList& operator= (const SigHandlersList& map_);
00155
00156 public:
00159 static SigHandlersList* m_instance[NSIG];
00160
00161 private:
00163 set_t* m_set;
00164
00169 int m_seen_cfh;
00170
00173 CFUNC_Handler* m_cfhp;
00174 };
00175
00176
00177
00178
00179
00180 inline
00181 SigHandlersList::
00182 SigHandlersList ()
00183 : m_seen_cfh (false), m_cfhp (NULL)
00184 {
00185 trace_with_mask("SigHandlersList::SigHandlersList", SIGHAND);
00186
00187 m_set = new set_t;
00188 }
00189
00190 inline
00191 SigHandlersList::
00192 ~SigHandlersList ()
00193 {
00194 trace_with_mask("SigHandlersList::~SigHandlersList", SIGHAND);
00195
00196 erase ();
00197 delete m_set;
00198 m_set = NULL;
00199 }
00200
00201 inline SigHandlersList*
00202 SigHandlersList::
00203 instance (int signum_)
00204 {
00205 trace_with_mask("SigHandlersList::instance", SIGHAND);
00206
00207 DL((APP, "m_instance[%d] = 0x%x\n", signum_,
00208 SigHandlersList::m_instance[signum_]));
00209
00210 if (SigHandlersList::m_instance[signum_] == 0) {
00211 DL((APP, "new SigHandlersList allocated\n"));
00212 SigHandlersList::m_instance[signum_] = new SigHandlersList();
00213 }
00214 return SigHandlersList::m_instance[signum_];
00215 }
00216
00217 inline bool
00218 SigHandlersList::
00219 empty () const
00220 {
00221 trace_with_mask("SigHandlersList::empty", SIGHAND);
00222
00223
00224
00225 return m_set->empty ();
00226 }
00227
00228 inline size_t
00229 SigHandlersList::
00230 size () const
00231 {
00232 trace_with_mask("SigHandlersList::size", SIGHAND);
00233
00234
00235
00236 return m_set->size ();
00237 }
00238
00239 inline bool
00240 SigHandlersList::
00241 insert (data_type eh_)
00242 {
00243 trace_with_mask("SigHandlersList::insert", SIGHAND);
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 set_t::const_iterator it = m_set->find (eh_);
00259
00260
00261 if (it == m_set->end ()) {
00262 return (m_set->insert (eh_)).second;
00263 }
00264
00265 return true;
00266 }
00267
00268 inline void
00269 SigHandlersList::
00270 erase (const key_type key_)
00271 {
00272
00273 trace_with_mask("SigHandlersList::erase(key_)", SIGHAND);
00274
00275 m_set->erase (key_);
00276 }
00277
00278 inline void
00279 SigHandlersList::
00280 erase ()
00281 {
00282
00283 trace_with_mask("SigHandlersList::erase(void)", SIGHAND);
00284
00285 m_set->erase (m_set->begin(), m_set->end());
00286 }
00287
00288 inline void
00289 SigHandlersList::
00290 erase(iterator it_)
00291 {
00292
00293 trace_with_mask("SigHandlersList::erase(it_)", SIGHAND);
00294
00295 m_set->erase(it_);
00296 }
00297
00298 inline SigHandlersList::iterator
00299 SigHandlersList::
00300 begin ()
00301 {
00302 trace_with_mask("SigHandlersList::begin()", SIGHAND);
00303
00304 return m_set->begin ();
00305 }
00306
00307 inline SigHandlersList::iterator
00308 SigHandlersList::
00309 end ()
00310 {
00311 trace_with_mask("SigHandlersList::end", SIGHAND);
00312
00313 return m_set->end ();
00314 }
00315
00316 inline SigHandlersList::iterator
00317 SigHandlersList::
00318 find (const key_type key_)
00319 {
00320 trace_with_mask("SigHandlersList::find", SIGHAND);
00321
00322 return m_set->find (key_);
00323 }
00324
00325
00326 inline CFUNC_Handler*
00327 SigHandlersList::
00328 cfunc_handler (CFUNC_Handler* cfhp_)
00329 {
00330 trace_with_mask("SigHandlersList::cfunc_handler", SIGHAND);
00331
00332 CFUNC_Handler* old_cfhp = m_cfhp;
00333 m_cfhp = cfhp_;
00334 m_seen_cfh = cfhp_ == NULL ? false : true;
00335 return old_cfhp;
00336 }
00337
00338 inline CFUNC_Handler*
00339 SigHandlersList::
00340 cfunc_handler () const
00341 {
00342 trace_with_mask("SigHandlersList::cfunc_handler", SIGHAND);
00343
00344 return m_cfhp;
00345 }
00346
00347 inline void
00348 SigHandlersList::
00349 seen_cfunc_handler (bool ft_)
00350 {
00351 trace_with_mask("SigHandlersList::seen_cfunc_handler", SIGHAND);
00352
00353 m_seen_cfh = ft_;
00354 }
00355
00356 inline bool
00357 SigHandlersList::
00358 seen_cfunc_handler () const
00359 {
00360 trace_with_mask("SigHandlersList::seen_cfunc_handler", SIGHAND);
00361
00362 return m_seen_cfh;
00363 }
00364
00365
00366
00367
00368
00369 inline
00370 CFUNC_Handler::
00371 CFUNC_Handler (C_SIG_HANDLER csigh_)
00372 : m_c_sig_hand (csigh_)
00373 {
00374 trace_with_mask("CFUNC_Handler::CFUNC_Handler", SIGHAND);
00375 }
00376
00377 inline int
00378 CFUNC_Handler::
00379 handle_signal (int signum_)
00380 {
00381 trace_with_mask("CFUNC_Handler::handle_signal", SIGHAND);
00382
00383 if (m_c_sig_hand) {
00384 (*m_c_sig_hand)(signum_);
00385 }
00386 return 1;
00387 }
00388
00389 #endif // !defined(WIN32)
00390
00391 }
00392
00393 #endif
00394