Sig_Adapter.cpp

Go to the documentation of this file.
00001 // $Id: Sig_Adapter.cpp 80826 2008-03-04 14:51:23Z wotte $
00002 
00003 #include "ace/Sig_Adapter.h"
00004 
00005 ACE_RCSID(ace, Sig_Adapter, "$Id: Sig_Adapter.cpp 80826 2008-03-04 14:51:23Z wotte $")
00006 
00007 
00008 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Sig_Action &sa, int sigkey)
00009   : sigkey_ (sigkey),
00010     type_ (SIG_ACTION),
00011     sa_ (sa)
00012 {
00013   // ACE_TRACE ("ACE_Sig_Adapter::ACE_Sig_Adapter");
00014 }
00015 
00016 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Event_Handler *eh,
00017                                   int sigkey)
00018   : sigkey_ (sigkey),
00019     type_ (ACE_HANDLER),
00020     eh_ (eh)
00021 {
00022   // ACE_TRACE ("ACE_Sig_Adapter::ACE_Sig_Adapter");
00023 }
00024 
00025 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Sig_Handler_Ex sig_func,
00026                                   int sigkey)
00027   : sigkey_ (sigkey),
00028     type_ (C_FUNCTION),
00029     sig_func_ (sig_func)
00030 {
00031   // ACE_TRACE ("ACE_Sig_Adapter::ACE_Sig_Adapter");
00032 }
00033 
00034 ACE_Sig_Adapter::~ACE_Sig_Adapter ()
00035 {
00036 }
00037 
00038 int
00039 ACE_Sig_Adapter::sigkey (void)
00040 {
00041   ACE_TRACE ("ACE_Sig_Adapter::sigkey");
00042   return this->sigkey_;
00043 }
00044 
00045 int
00046 ACE_Sig_Adapter::handle_signal (int signum,
00047                                 siginfo_t *siginfo,
00048                                 ucontext_t *ucontext)
00049 {
00050   ACE_TRACE ("ACE_Sig_Adapter::handle_signal");
00051 
00052   switch (this->type_)
00053     {
00054     case SIG_ACTION:
00055       {
00056         // We have to dispatch a handler that was registered by a
00057         // third-party library.
00058 
00059         ACE_Sig_Action old_disp;
00060 
00061         // Make sure this handler executes in the context it was
00062         // expecting...
00063         this->sa_.register_action (signum, &old_disp);
00064 
00065         ACE_Sig_Handler_Ex sig_func = ACE_Sig_Handler_Ex (this->sa_.handler ());
00066 
00067         (*sig_func) (signum, siginfo, ucontext);
00068         // Restore the original disposition.
00069         old_disp.register_action (signum);
00070         break;
00071       }
00072     case ACE_HANDLER:
00073       this->eh_->handle_signal (signum, siginfo, ucontext);
00074       break;
00075     case C_FUNCTION:
00076       (*this->sig_func_) (signum, siginfo, ucontext);
00077       break;
00078     }
00079   return 0;
00080 }

Generated on Tue Feb 2 17:18:42 2010 for ACE by  doxygen 1.4.7