Also use Objects as part of an operation but as a result don't generate Any operation...
[ACE_TAO.git] / ACE / ace / Sig_Adapter.cpp
blob18a5cc9b952de9dac6b65004999930d5840a97b2
1 #include "ace/Sig_Adapter.h"
3 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Sig_Action &sa, int sigkey)
4 : sigkey_ (sigkey),
5 type_ (SIG_ACTION),
6 sa_ (sa),
7 eh_ (0),
8 sig_func_ (0)
10 // ACE_TRACE ("ACE_Sig_Adapter::ACE_Sig_Adapter");
13 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Event_Handler *eh,
14 int sigkey)
15 : sigkey_ (sigkey),
16 type_ (ACE_HANDLER),
17 eh_ (eh),
18 sig_func_ (0)
20 // ACE_TRACE ("ACE_Sig_Adapter::ACE_Sig_Adapter");
23 ACE_Sig_Adapter::ACE_Sig_Adapter (ACE_Sig_Handler_Ex sig_func,
24 int sigkey)
25 : sigkey_ (sigkey),
26 type_ (C_FUNCTION),
27 eh_ (0),
28 sig_func_ (sig_func)
30 // ACE_TRACE ("ACE_Sig_Adapter::ACE_Sig_Adapter");
33 ACE_Sig_Adapter::~ACE_Sig_Adapter ()
37 ACE_ALLOC_HOOK_DEFINE(ACE_Sig_Adapter)
39 int
40 ACE_Sig_Adapter::sigkey (void)
42 ACE_TRACE ("ACE_Sig_Adapter::sigkey");
43 return this->sigkey_;
46 int
47 ACE_Sig_Adapter::handle_signal (int signum,
48 siginfo_t *siginfo,
49 ucontext_t *ucontext)
51 ACE_TRACE ("ACE_Sig_Adapter::handle_signal");
53 switch (this->type_)
55 case SIG_ACTION:
57 // We have to dispatch a handler that was registered by a
58 // third-party library.
60 ACE_Sig_Action old_disp;
62 // Make sure this handler executes in the context it was
63 // expecting...
64 this->sa_.register_action (signum, &old_disp);
66 ACE_Sig_Handler_Ex sig_func = ACE_Sig_Handler_Ex (this->sa_.handler ());
68 (*sig_func) (signum, siginfo, ucontext);
69 // Restore the original disposition.
70 old_disp.register_action (signum);
71 break;
73 case ACE_HANDLER:
74 this->eh_->handle_signal (signum, siginfo, ucontext);
75 break;
76 case C_FUNCTION:
77 (*this->sig_func_) (signum, siginfo, ucontext);
78 break;
80 return 0;