00001 #include "ace_pch.h"
00002
00003
00004 #include "ace/Synch_T.h"
00005 #include "ace/Signal.h"
00006 #include "ace/Object_Manager.h"
00007 #include "ace/Log_Msg.h"
00008 #include "ace/Containers.h"
00009
00010 #if !defined (__ACE_INLINE__)
00011 #include "ace/Signal.i"
00012 #endif
00013
00014 ACE_RCSID(ace, Signal, "$Id: Signal.cpp,v 1.1.1.4.2.1 2003/03/13 19:44:22 chad Exp $")
00015
00016
00017
00018 #if defined (ACE_HAS_SIG_C_FUNC)
00019
00020 extern "C" void
00021 ace_sig_handler_dispatch (int signum, siginfo_t *info, ucontext_t *context)
00022 {
00023 ACE_TRACE ("ace_sig_handler_dispatch");
00024 ACE_Sig_Handler::dispatch (signum, info, context);
00025 }
00026
00027 #define ace_signal_handler_dispatcher ACE_SignalHandler(ace_sig_handler_dispatch)
00028
00029 #if !defined (ACE_HAS_BROKEN_HPUX_TEMPLATES)
00030 extern "C" void
00031 ace_sig_handlers_dispatch (int signum, siginfo_t *info, ucontext_t *context)
00032 {
00033 ACE_TRACE ("ace_sig_handlers_dispatch");
00034 ACE_Sig_Handlers::dispatch (signum, info, context);
00035 }
00036
00037 #define ace_signal_handlers_dispatcher ACE_SignalHandler(ace_sig_handlers_dispatch)
00038 #endif
00039
00040 #else
00041 #define ace_signal_handler_dispatcher ACE_SignalHandler(ACE_Sig_Handler::dispatch)
00042
00043 #if !defined (ACE_HAS_BROKEN_HPUX_TEMPLATES)
00044 #define ace_signal_handlers_dispatcher ACE_SignalHandler(ACE_Sig_Handlers::dispatch)
00045 #endif
00046 #endif
00047
00048
00049 ACE_Event_Handler *ACE_Sig_Handler::signal_handlers_[ACE_NSIG];
00050
00051
00052 sig_atomic_t ACE_Sig_Handler::sig_pending_ = 0;
00053
00054 ACE_ALLOC_HOOK_DEFINE(ACE_Sig_Action)
00055
00056 void
00057 ACE_Sig_Action::dump (void) const
00058 {
00059 ACE_TRACE ("ACE_Sig_Action::dump");
00060 }
00061
00062 ACE_ALLOC_HOOK_DEFINE(ACE_Sig_Set)
00063
00064 void
00065 ACE_Sig_Set::dump (void) const
00066 {
00067 ACE_TRACE ("ACE_Sig_Set::dump");
00068 }
00069
00070 ACE_ALLOC_HOOK_DEFINE(ACE_Sig_Guard)
00071
00072 void
00073 ACE_Sig_Guard::dump (void) const
00074 {
00075 ACE_TRACE ("ACE_Sig_Guard::dump");
00076 }
00077
00078 ACE_Sig_Action::ACE_Sig_Action (void)
00079 {
00080
00081 this->sa_.sa_flags = 0;
00082
00083
00084
00085
00086 #if !defined (ACE_WIN32)
00087 ACE_OS::sigemptyset (&this->sa_.sa_mask);
00088 #endif
00089 this->sa_.sa_handler = 0;
00090 }
00091
00092 ACE_Sig_Action::ACE_Sig_Action (ACE_SignalHandler sig_handler,
00093 sigset_t *sig_mask,
00094 int sig_flags)
00095 {
00096
00097 this->sa_.sa_flags = sig_flags;
00098
00099 if (sig_mask == 0)
00100 ACE_OS::sigemptyset (&this->sa_.sa_mask);
00101 else
00102 this->sa_.sa_mask = *sig_mask;
00103
00104 #if !defined(ACE_HAS_TANDEM_SIGNALS)
00105 this->sa_.sa_handler = ACE_SignalHandlerV (sig_handler);
00106 #else
00107 this->sa_.sa_handler = (void (*)()) ACE_SignalHandlerV (sig_handler);
00108 #endif
00109 }
00110
00111 ACE_Sig_Action::ACE_Sig_Action (ACE_SignalHandler sig_handler,
00112 const ACE_Sig_Set &sig_mask,
00113 int sig_flags)
00114 {
00115
00116 this->sa_.sa_flags = sig_flags;
00117
00118
00119 this->sa_.sa_mask = sig_mask.sigset ();
00120
00121 #if !defined(ACE_HAS_TANDEM_SIGNALS)
00122 this->sa_.sa_handler = ACE_SignalHandlerV (sig_handler);
00123 #else
00124 this->sa_.sa_handler = (void (*)()) ACE_SignalHandlerV (sig_handler);
00125 #endif
00126 }
00127
00128 ACE_Sig_Action::ACE_Sig_Action (ACE_SignalHandler sig_handler,
00129 int signum,
00130 sigset_t *sig_mask,
00131 int sig_flags)
00132 {
00133
00134 this->sa_.sa_flags = sig_flags;
00135
00136 if (sig_mask == 0)
00137 ACE_OS::sigemptyset (&this->sa_.sa_mask);
00138 else
00139 this->sa_.sa_mask = *sig_mask;
00140
00141 #if !defined(ACE_HAS_TANDEM_SIGNALS)
00142 this->sa_.sa_handler = ACE_SignalHandlerV (sig_handler);
00143 #else
00144 this->sa_.sa_handler = (void (*)()) ACE_SignalHandlerV (sig_handler);
00145 #endif
00146 ACE_OS::sigaction (signum, &this->sa_, 0);
00147 }
00148
00149 ACE_Sig_Action::ACE_Sig_Action (ACE_SignalHandler sig_handler,
00150 int signum,
00151 const ACE_Sig_Set &sig_mask,
00152 int sig_flags)
00153 {
00154
00155 this->sa_.sa_flags = sig_flags;
00156
00157
00158 this->sa_.sa_mask = sig_mask.sigset ();
00159
00160 #if !defined(ACE_HAS_TANDEM_SIGNALS)
00161 this->sa_.sa_handler = ACE_SignalHandlerV (sig_handler);
00162 #else
00163 this->sa_.sa_handler = (void (*)()) ACE_SignalHandlerV (sig_handler);
00164 #endif
00165 ACE_OS::sigaction (signum, &this->sa_, 0);
00166 }
00167
00168 ACE_Sig_Action::ACE_Sig_Action (const ACE_Sig_Set &signals,
00169 ACE_SignalHandler sig_handler,
00170 const ACE_Sig_Set &sig_mask,
00171 int sig_flags)
00172 {
00173
00174 this->sa_.sa_flags = sig_flags;
00175
00176
00177 this->sa_.sa_mask = sig_mask.sigset ();
00178
00179 #if !defined(ACE_HAS_TANDEM_SIGNALS)
00180 this->sa_.sa_handler = ACE_SignalHandlerV (sig_handler);
00181 #else
00182 this->sa_.sa_handler = (void (*)()) ACE_SignalHandlerV (sig_handler);
00183 #endif
00184
00185 #if (ACE_NSIG > 0) && !defined (CHORUS)
00186 for (int s = 1; s < ACE_NSIG; s++)
00187 if (signals.is_member (s))
00188 ACE_OS::sigaction (s, &this->sa_, 0);
00189 #else
00190 ACE_UNUSED_ARG (signals);
00191 #endif
00192 }
00193
00194 ACE_Sig_Action::ACE_Sig_Action (const ACE_Sig_Set &signals,
00195 ACE_SignalHandler sig_handler,
00196 sigset_t *sig_mask,
00197 int sig_flags)
00198 {
00199
00200 this->sa_.sa_flags = sig_flags;
00201
00202 if (sig_mask == 0)
00203 ACE_OS::sigemptyset (&this->sa_.sa_mask);
00204 else
00205 this->sa_.sa_mask = *sig_mask;
00206
00207 #if !defined(ACE_HAS_TANDEM_SIGNALS)
00208 this->sa_.sa_handler = ACE_SignalHandlerV (sig_handler);
00209 #else
00210 this->sa_.sa_handler = (void (*)()) ACE_SignalHandlerV (sig_handler);
00211 #endif
00212
00213 #if (ACE_NSIG > 0) && !defined (CHORUS)
00214 for (int s = 1; s < ACE_NSIG; s++)
00215 if (signals.is_member (s))
00216 ACE_OS::sigaction (s, &this->sa_, 0);
00217 #else
00218 ACE_UNUSED_ARG (signals);
00219 #endif
00220 }
00221
00222 ACE_ALLOC_HOOK_DEFINE(ACE_Sig_Handler)
00223
00224 void
00225 ACE_Sig_Handler::dump (void) const
00226 {
00227 ACE_TRACE ("ACE_Sig_Handler::dump");
00228 }
00229
00230 int
00231 ACE_Sig_Handler::sig_pending (void)
00232 {
00233 ACE_TRACE ("ACE_Sig_Handler::sig_pending");
00234 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00235 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00236 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00237 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00238 return ACE_Sig_Handler::sig_pending_ != 0;
00239 }
00240
00241 void
00242 ACE_Sig_Handler::sig_pending (int pending)
00243 {
00244 ACE_TRACE ("ACE_Sig_Handler::sig_pending");
00245
00246 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00247 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00248 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00249 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00250 ACE_Sig_Handler::sig_pending_ = pending;
00251 }
00252
00253 ACE_Event_Handler *
00254 ACE_Sig_Handler::handler (int signum)
00255 {
00256 ACE_TRACE ("ACE_Sig_Handler::handler");
00257 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00258 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00259 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00260 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00261
00262 if (ACE_Sig_Handler::in_range (signum))
00263 return ACE_Sig_Handler::signal_handlers_[signum];
00264 else
00265 return 0;
00266 }
00267
00268 ACE_Event_Handler *
00269 ACE_Sig_Handler::handler_i (int signum,
00270 ACE_Event_Handler *new_sh)
00271 {
00272 ACE_TRACE ("ACE_Sig_Handler::handler_i");
00273
00274 if (ACE_Sig_Handler::in_range (signum))
00275 {
00276 ACE_Event_Handler *sh = ACE_Sig_Handler::signal_handlers_[signum];
00277
00278 ACE_Sig_Handler::signal_handlers_[signum] = new_sh;
00279 return sh;
00280 }
00281 else
00282 return 0;
00283 }
00284
00285 ACE_Event_Handler *
00286 ACE_Sig_Handler::handler (int signum,
00287 ACE_Event_Handler *new_sh)
00288 {
00289 ACE_TRACE ("ACE_Sig_Handler::handler");
00290 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00291 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00292 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00293 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00294
00295 return ACE_Sig_Handler::handler_i (signum, new_sh);
00296 }
00297
00298
00299
00300
00301
00302 int
00303 ACE_Sig_Handler::register_handler_i (int signum,
00304 ACE_Event_Handler *new_sh,
00305 ACE_Sig_Action *new_disp,
00306 ACE_Event_Handler **old_sh,
00307 ACE_Sig_Action *old_disp)
00308 {
00309 ACE_TRACE ("ACE_Sig_Handler::register_handler_i");
00310
00311 if (ACE_Sig_Handler::in_range (signum))
00312 {
00313 ACE_Sig_Action sa;
00314 ACE_Event_Handler *sh = ACE_Sig_Handler::handler_i (signum,
00315 new_sh);
00316
00317
00318
00319 if (old_sh != 0)
00320 *old_sh = sh;
00321
00322
00323
00324 if (new_disp == 0)
00325 new_disp = &sa;
00326
00327 new_disp->handler (ace_signal_handler_dispatcher);
00328 #if !defined (ACE_HAS_LYNXOS_SIGNALS)
00329 new_disp->flags (new_disp->flags () | SA_SIGINFO);
00330 #endif
00331 return new_disp->register_action (signum, old_disp);
00332 }
00333 else
00334 return -1;
00335 }
00336
00337
00338
00339
00340
00341 int
00342 ACE_Sig_Handler::register_handler (int signum,
00343 ACE_Event_Handler *new_sh,
00344 ACE_Sig_Action *new_disp,
00345 ACE_Event_Handler **old_sh,
00346 ACE_Sig_Action *old_disp)
00347 {
00348 ACE_TRACE ("ACE_Sig_Handler::register_handler");
00349 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00350 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00351 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00352 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00353
00354 return ACE_Sig_Handler::register_handler_i (signum,
00355 new_sh,
00356 new_disp,
00357 old_sh,
00358 old_disp);
00359 }
00360
00361
00362
00363 int
00364 ACE_Sig_Handler::remove_handler (int signum,
00365 ACE_Sig_Action *new_disp,
00366 ACE_Sig_Action *old_disp,
00367 int)
00368 {
00369 ACE_TRACE ("ACE_Sig_Handler::remove_handler");
00370 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00371 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00372 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00373 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00374
00375 if (ACE_Sig_Handler::in_range (signum))
00376 {
00377 ACE_Sig_Action sa (SIG_DFL, (sigset_t *) 0);
00378
00379 if (new_disp == 0)
00380 new_disp = &sa;
00381
00382 ACE_Sig_Handler::signal_handlers_[signum] = 0;
00383
00384
00385 return new_disp->register_action (signum, old_disp);
00386 }
00387 else
00388 return -1;
00389 }
00390
00391
00392
00393
00394 void
00395 ACE_Sig_Handler::dispatch (int signum,
00396 siginfo_t *siginfo,
00397 ucontext_t *ucontext)
00398 {
00399 ACE_TRACE ("ACE_Sig_Handler::dispatch");
00400
00401
00402 ACE_Errno_Guard error (errno);
00403
00404
00405
00406 ACE_Sig_Handler::sig_pending_ = 1;
00407
00408
00409 ACE_ASSERT (ACE_Sig_Handler::in_range (signum));
00410
00411 ACE_Event_Handler *eh = ACE_Sig_Handler::signal_handlers_[signum];
00412
00413 if (eh != 0)
00414 {
00415 if (eh->handle_signal (signum, siginfo, ucontext) == -1)
00416 {
00417
00418 ACE_Sig_Action sa ((ACE_SignalHandler) SIG_DFL, (sigset_t *) 0);
00419
00420 ACE_Sig_Handler::signal_handlers_[signum] = 0;
00421
00422
00423
00424 sa.register_action (signum);
00425
00426
00427 eh->handle_close (ACE_INVALID_HANDLE,
00428 ACE_Event_Handler::SIGNAL_MASK);
00429 }
00430 #if defined (ACE_WIN32)
00431 else
00432
00433
00434
00435
00436
00437 ACE_Sig_Handler::register_handler_i (signum,
00438 eh);
00439 #endif
00440 }
00441 }
00442
00443 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Sig_Action &sa, int sigkey)
00444 : sigkey_ (sigkey),
00445 type_ (SIG_ACTION),
00446 sa_ (sa)
00447 {
00448
00449 }
00450
00451 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Event_Handler *eh,
00452 int sigkey)
00453 : sigkey_ (sigkey),
00454 type_ (ACE_HANDLER),
00455 eh_ (eh)
00456 {
00457
00458 }
00459
00460 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Sig_Handler_Ex sig_func,
00461 int sigkey)
00462 : sigkey_ (sigkey),
00463 type_ (C_FUNCTION),
00464 sig_func_ (sig_func)
00465 {
00466
00467 }
00468
00469 int
00470 ACE_Sig_Adapter::sigkey (void)
00471 {
00472 ACE_TRACE ("ACE_Sig_Adapter::sigkey");
00473 return this->sigkey_;
00474 }
00475
00476 int
00477 ACE_Sig_Adapter::handle_signal (int signum,
00478 siginfo_t *siginfo,
00479 ucontext_t *ucontext)
00480 {
00481 ACE_TRACE ("ACE_Sig_Adapter::handle_signal");
00482
00483 switch (this->type_)
00484 {
00485 case SIG_ACTION:
00486 {
00487
00488
00489
00490 ACE_Sig_Action old_disp;
00491
00492
00493
00494 this->sa_.register_action (signum, &old_disp);
00495
00496 ACE_Sig_Handler_Ex sig_func = ACE_Sig_Handler_Ex (this->sa_.handler ());
00497
00498 (*sig_func) (signum, siginfo, ucontext);
00499
00500 old_disp.register_action (signum);
00501 break;
00502 }
00503 case ACE_HANDLER:
00504 this->eh_->handle_signal (signum, siginfo, ucontext);
00505 break;
00506 case C_FUNCTION:
00507 (*this->sig_func_) (signum, siginfo, ucontext);
00508 break;
00509 }
00510 return 0;
00511 }
00512
00513
00514
00515
00516
00517
00518 #if !defined (ACE_HAS_BROKEN_HPUX_TEMPLATES)
00519 #define ACE_MAX_SIGNAL_HANDLERS ((size_t) 20)
00520
00521
00522
00523
00524 int ACE_Sig_Handlers::sigkey_ = 0;
00525
00526
00527
00528 int ACE_Sig_Handlers::third_party_sig_handler_ = 0;
00529
00530
00531 typedef ACE_Fixed_Set <ACE_Event_Handler *, ACE_MAX_SIGNAL_HANDLERS> ACE_SIG_HANDLERS_SET;
00532 typedef ACE_Fixed_Set_Iterator <ACE_Event_Handler *, ACE_MAX_SIGNAL_HANDLERS> ACE_SIG_HANDLERS_ITERATOR;
00533
00534 class ACE_Sig_Handlers_Set
00535 {
00536 public:
00537 static ACE_SIG_HANDLERS_SET *instance (int signum);
00538
00539 private:
00540 static ACE_SIG_HANDLERS_SET *sig_handlers_[ACE_NSIG];
00541 };
00542
00543
00544 ACE_SIG_HANDLERS_SET *ACE_Sig_Handlers_Set::sig_handlers_[ACE_NSIG];
00545
00546
00547 ACE_SIG_HANDLERS_SET *
00548 ACE_Sig_Handlers_Set::instance (int signum)
00549 {
00550 if (signum <= 0 || signum >= ACE_NSIG)
00551 return 0;
00552 else if (ACE_Sig_Handlers_Set::sig_handlers_[signum] == 0)
00553 ACE_NEW_RETURN (ACE_Sig_Handlers_Set::sig_handlers_[signum],
00554 ACE_SIG_HANDLERS_SET,
00555 0);
00556 return ACE_Sig_Handlers_Set::sig_handlers_[signum];
00557 }
00558
00559 ACE_ALLOC_HOOK_DEFINE(ACE_Sig_Handlers)
00560
00561 void
00562 ACE_Sig_Handlers::dump (void) const
00563 {
00564 ACE_TRACE ("ACE_Sig_Handlers::dump");
00565 }
00566
00567
00568
00569
00570 int
00571 ACE_Sig_Handlers::register_handler (int signum,
00572 ACE_Event_Handler *new_sh,
00573 ACE_Sig_Action *new_disp,
00574 ACE_Event_Handler **,
00575 ACE_Sig_Action *old_disp)
00576 {
00577 ACE_TRACE ("ACE_Sig_Handlers::register_handler");
00578 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00579 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00580 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00581 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00582
00583 if (ACE_Sig_Handler::in_range (signum))
00584 {
00585 ACE_Sig_Adapter *ace_sig_adapter = 0;
00586 ACE_Sig_Adapter *extern_sh = 0;
00587 ACE_Sig_Action sa;
00588
00589
00590 sa.retrieve_action (signum);
00591
00592
00593
00594
00595 if (!(sa.handler () == ace_signal_handlers_dispatcher
00596 || sa.handler () == ACE_SignalHandler (SIG_IGN)
00597 || sa.handler () == ACE_SignalHandler (SIG_DFL)))
00598 {
00599
00600
00601
00602
00603
00604 if (ACE_BIT_DISABLED (sa.flags (), SA_RESTART)
00605 && ACE_Sig_Handlers::third_party_sig_handler_)
00606
00607
00608 return -1;
00609
00610
00611 ACE_Sig_Handlers::third_party_sig_handler_ = 1;
00612
00613
00614
00615 ACE_NEW_RETURN (extern_sh,
00616 ACE_Sig_Adapter (sa,
00617 ++ACE_Sig_Handlers::sigkey_),
00618 -1);
00619
00620
00621 if (ACE_Sig_Handlers_Set::instance (signum)->insert (extern_sh) == -1)
00622 {
00623 delete extern_sh;
00624 return -1;
00625 }
00626 }
00627
00628 ACE_NEW_RETURN (ace_sig_adapter,
00629 ACE_Sig_Adapter (new_sh,
00630 ++ACE_Sig_Handlers::sigkey_),
00631 -1);
00632
00633
00634
00635 if (ACE_Sig_Handlers_Set::instance (signum)->insert (ace_sig_adapter) == -1)
00636 {
00637
00638
00639 if (extern_sh)
00640 {
00641 ACE_Sig_Handlers_Set::instance (signum)->remove (extern_sh);
00642 delete extern_sh;
00643 }
00644 delete ace_sig_adapter;
00645 return -1;
00646 }
00647
00648 else if (sa.handler () == ace_signal_handlers_dispatcher)
00649 return ace_sig_adapter->sigkey ();
00650
00651
00652
00653 else
00654 {
00655
00656
00657 if (new_disp == 0)
00658 new_disp = &sa;
00659
00660 new_disp->handler (ace_signal_handlers_dispatcher);
00661
00662
00663 new_disp->flags (new_disp->flags () | SA_RESTART);
00664 new_disp->flags (new_disp->flags () | SA_SIGINFO);
00665
00666
00667
00668 if (new_disp->register_action (signum, old_disp) == -1)
00669 {
00670
00671 ACE_Sig_Handlers_Set::instance (signum)->remove (ace_sig_adapter);
00672 delete ace_sig_adapter;
00673
00674 if (extern_sh)
00675 {
00676 ACE_Sig_Handlers_Set::instance (signum)->remove (extern_sh);
00677 delete extern_sh;
00678 }
00679 return -1;
00680 }
00681 else
00682
00683 return ace_sig_adapter->sigkey ();
00684 }
00685 }
00686 else
00687 return -1;
00688 }
00689
00690
00691
00692
00693
00694
00695 int
00696 ACE_Sig_Handlers::remove_handler (int signum,
00697 ACE_Sig_Action *new_disp,
00698 ACE_Sig_Action *old_disp,
00699 int sigkey)
00700 {
00701 ACE_TRACE ("ACE_Sig_Handlers::remove_handler");
00702 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00703 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00704 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00705 ACE_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00706
00707 if (ACE_Sig_Handler::in_range (signum))
00708 {
00709 ACE_SIG_HANDLERS_SET *handler_set =
00710 ACE_Sig_Handlers_Set::instance (signum);
00711
00712 ACE_SIG_HANDLERS_ITERATOR handler_iterator (*handler_set);
00713
00714
00715
00716 for (ACE_Event_Handler **eh;
00717 handler_iterator.next (eh) != 0;
00718 handler_iterator.advance ())
00719 {
00720
00721 ACE_Sig_Adapter *sh = (ACE_Sig_Adapter *) *eh;
00722
00723
00724
00725
00726
00727 if (sh->sigkey () == sigkey || sigkey == -1)
00728 {
00729 handler_set->remove (*eh);
00730 delete *eh;
00731 }
00732 }
00733
00734 if (handler_set->size () == 0)
00735 {
00736
00737
00738
00739
00740 ACE_Sig_Action sa (SIG_DFL, (sigset_t *) 0);
00741
00742 if (new_disp == 0)
00743 new_disp = &sa;
00744
00745 return new_disp->register_action (signum, old_disp);
00746 }
00747 return 0;
00748 }
00749 else
00750 return -1;
00751 }
00752
00753
00754
00755
00756 void
00757 ACE_Sig_Handlers::dispatch (int signum,
00758 siginfo_t *siginfo,
00759 ucontext_t *ucontext)
00760 {
00761 ACE_TRACE ("ACE_Sig_Handlers::dispatch");
00762
00763
00764 #if 0
00765 ACE_MT (ACE_Recursive_Thread_Mutex *lock =
00766 ACE_Managed_Object<ACE_Recursive_Thread_Mutex>::get_preallocated_object
00767 (ACE_Object_Manager::ACE_SIG_HANDLER_LOCK);
00768 ACE_TSS_Guard<ACE_Recursive_Thread_Mutex> m (*lock));
00769 #endif
00770
00771
00772 ACE_Errno_Guard error (errno);
00773
00774 ACE_Sig_Handler::sig_pending_ = 1;
00775
00776
00777 ACE_ASSERT (ACE_Sig_Handler::in_range (signum));
00778
00779 ACE_SIG_HANDLERS_SET *handler_set =
00780 ACE_Sig_Handlers_Set::instance (signum);
00781
00782 ACE_SIG_HANDLERS_ITERATOR handler_iterator (*handler_set);
00783
00784 for (ACE_Event_Handler **eh = 0;
00785 handler_iterator.next (eh) != 0;
00786 handler_iterator.advance ())
00787 {
00788 if ((*eh)->handle_signal (signum, siginfo, ucontext) == -1)
00789 {
00790 handler_set->remove (*eh);
00791 delete *eh;
00792 }
00793 }
00794 }
00795
00796
00797
00798
00799
00800 ACE_Event_Handler *
00801 ACE_Sig_Handlers::handler (int signum)
00802 {
00803 ACE_TRACE ("ACE_Sig_Handlers::handler");
00804 ACE_SIG_HANDLERS_SET *handler_set =
00805 ACE_Sig_Handlers_Set::instance (signum);
00806 ACE_SIG_HANDLERS_ITERATOR handler_iterator (*handler_set);
00807 ACE_Event_Handler **eh = 0;
00808 handler_iterator.next (eh);
00809 return *eh;
00810 }
00811
00812
00813
00814
00815
00816
00817
00818 ACE_Event_Handler *
00819 ACE_Sig_Handlers::handler (int signum, ACE_Event_Handler *new_sh)
00820 {
00821 ACE_TRACE ("ACE_Sig_Handlers::handler");
00822 ACE_SIG_HANDLERS_SET *handler_set =
00823 ACE_Sig_Handlers_Set::instance (signum);
00824 ACE_SIG_HANDLERS_ITERATOR handler_iterator (*handler_set);
00825 ACE_Event_Handler **eh = 0;
00826
00827
00828 handler_iterator.next (eh);
00829
00830
00831 handler_set->remove (*eh);
00832
00833
00834
00835
00836 ACE_Sig_Adapter *temp;
00837
00838 ACE_NEW_RETURN (temp,
00839 ACE_Sig_Adapter (new_sh,
00840 ++ACE_Sig_Handlers::sigkey_),
00841 0);
00842 handler_set->insert (temp);
00843 return *eh;
00844 }
00845
00846 #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
00847 ACE_MT (template class ACE_TSS_Guard<ACE_Recursive_Thread_Mutex>);
00848 ACE_MT (template class ACE_Guard<ACE_Recursive_Thread_Mutex>);
00849 template class ACE_Fixed_Set<ACE_Event_Handler *, ACE_MAX_SIGNAL_HANDLERS>;
00850 template class ACE_Fixed_Set_Iterator<ACE_Event_Handler *, ACE_MAX_SIGNAL_HANDLERS>;
00851 #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
00852 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00853 #pragma instantiate ACE_TSS_Guard<ACE_Recursive_Thread_Mutex>
00854 #pragma instantiate ACE_Guard<ACE_Recursive_Thread_Mutex>
00855 #endif
00856 #pragma instantiate ACE_Fixed_Set<ACE_Event_Handler *, ACE_MAX_SIGNAL_HANDLERS>
00857 #pragma instantiate ACE_Fixed_Set_Iterator<ACE_Event_Handler *, ACE_MAX_SIGNAL_HANDLERS>
00858 #endif
00859
00860 #endif