1 martin 1.35 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.36 //
|
3 martin 1.35 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.36 //
|
10 martin 1.35 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.36 //
|
17 martin 1.35 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.36 //
|
20 martin 1.35 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.36 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.35 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.36 //
|
28 martin 1.35 //////////////////////////////////////////////////////////////////////////
|
29 mike 1.2 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
|
32 kumpf 1.14 #include <cstdio>
33 #include <cstring>
34
|
35 mike 1.2 #include <Pegasus/Common/Config.h>
36 #include <Pegasus/Common/Signal.h>
|
37 david.dillard 1.22 #include <Pegasus/Common/Exception.h>
|
38 mike 1.2
|
39 kumpf 1.14 PEGASUS_NAMESPACE_BEGIN
|
40 mike 1.2
|
41 kumpf 1.14 #ifdef PEGASUS_HAS_SIGNALS
|
42 mike 1.2
|
43 david.dillard 1.21 SignalHandler::SignalHandler()
|
44 mike 1.2 {
|
45 kumpf 1.30 for (unsigned i = 0; i <= PEGASUS_NSIG; i++)
|
46 david.dillard 1.22 {
|
47 david.dillard 1.21 register_handler &rh = reg_handler[i];
48 rh.signum = i;
49 rh.active = 0;
50 rh.sh = NULL;
51 memset(&rh.oldsa,0,sizeof(struct sigaction));
|
52 david.dillard 1.22 }
|
53 mike 1.2 }
54
55 SignalHandler::~SignalHandler()
56 {
|
57 david.dillard 1.22 deactivateAll();
|
58 mike 1.2 }
59
|
60 david.dillard 1.24 void SignalHandler::verifySignum(unsigned signum)
|
61 david.dillard 1.21 {
62 if ( signum > PEGASUS_NSIG )
63 {
|
64 david.dillard 1.22 throw IndexOutOfBoundsException();
|
65 david.dillard 1.21 }
|
66 david.dillard 1.22 }
|
67 david.dillard 1.21
|
68 kumpf 1.30 SignalHandler::register_handler&
|
69 david.dillard 1.24 SignalHandler::getHandler(unsigned signum)
|
70 david.dillard 1.22 {
71 verifySignum(signum);
|
72 kumpf 1.30 return reg_handler[signum];
|
73 david.dillard 1.21 }
74
|
75 kumpf 1.34 void SignalHandler::registerHandler(unsigned signum, signal_handler sighandler)
|
76 mike 1.2 {
|
77 david.dillard 1.21 register_handler &rh = getHandler(signum);
|
78 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
79 david.dillard 1.21 deactivate_i(rh);
|
80 kumpf 1.34 rh.sh = sighandler;
|
81 mike 1.2 }
82
|
83 david.dillard 1.24 void SignalHandler::activate(unsigned signum)
|
84 mike 1.2 {
|
85 david.dillard 1.21 register_handler &rh = getHandler(signum);
|
86 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
87 david.dillard 1.21 if (rh.active)
88 {
89 return; // throw exception
90 }
|
91 mike 1.2
|
92 david.dillard 1.25 struct sigaction sig_acts;
|
93 mike 1.2
|
94 david.dillard 1.25 sig_acts.sa_sigaction = rh.sh;
95 sigfillset(&(sig_acts.sa_mask));
96 sig_acts.sa_flags = SA_SIGINFO;
|
97 mike 1.2
|
98 david.dillard 1.25 sigaction(signum, &sig_acts, &rh.oldsa);
|
99 mike 1.2
|
100 david.dillard 1.21 rh.active = -1;
|
101 mike 1.2 }
102
|
103 david.dillard 1.24 void SignalHandler::deactivate(unsigned signum)
|
104 mike 1.2 {
|
105 david.dillard 1.22 register_handler &rh = getHandler(signum);
|
106 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
107 david.dillard 1.21 deactivate_i(rh);
|
108 mike 1.2 }
109
|
110 david.dillard 1.21 void SignalHandler::deactivate_i(register_handler &rh)
|
111 mike 1.2 {
|
112 david.dillard 1.21 if (rh.active)
|
113 mike 1.2 {
|
114 david.dillard 1.21 rh.active = 0;
115 sigaction(rh.signum, &rh.oldsa, NULL);
|
116 mike 1.2 }
117 }
118
119 void SignalHandler::deactivateAll()
120 {
|
121 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
122 david.dillard 1.24 for (unsigned i=0; i <= PEGASUS_NSIG; i++)
|
123 david.dillard 1.21 {
124 register_handler &rh = reg_handler[i];
125 if (rh.active)
126 {
127 deactivate_i(rh);
128 }
129 }
|
130 mike 1.2 }
131
|
132 david.dillard 1.24 void SignalHandler::ignore(unsigned signum)
|
133 mike 1.2 {
|
134 david.dillard 1.22 verifySignum(signum);
|
135 david.dillard 1.21
|
136 ouyang.jian 1.32 #if !defined(PEGASUS_OS_DARWIN)
|
137 david.dillard 1.22 sigignore(signum);
|
138 chuck 1.12 #else
|
139 david.dillard 1.25 struct sigaction sig_acts;
|
140 chuck 1.12
|
141 david.dillard 1.25 sig_acts.sa_handler = SIG_IGN;
142 sigfillset(&(sig_acts.sa_mask));
143 sig_acts.sa_flags = 0;
|
144 chuck 1.12
|
145 david.dillard 1.25 sigaction(signum, &sig_acts, NULL);
|
146 chuck 1.12 #endif
|
147 mike 1.2 }
|
148 kumpf 1.14
|
149 mateus.baur 1.33 void SignalHandler::defaultAction(unsigned signum)
150 {
151 verifySignum(signum);
152
153 struct sigaction sig_acts;
154
155 sig_acts.sa_handler = SIG_DFL;
156 sigfillset(&(sig_acts.sa_mask));
157 sig_acts.sa_flags = 0;
158
159 sigaction(signum, &sig_acts, NULL);
160 }
161
162
|
163 kumpf 1.14 #else // PEGASUS_HAS_SIGNALS
164
165 SignalHandler::SignalHandler() { }
166
167 SignalHandler::~SignalHandler() { }
168
|
169 david.dillard 1.24 void SignalHandler::registerHandler(unsigned signum, signal_handler _sighandler)
|
170 kumpf 1.14 { }
171
|
172 david.dillard 1.24 void SignalHandler::activate(unsigned signum) { }
|
173 kumpf 1.14
|
174 david.dillard 1.24 void SignalHandler::deactivate(unsigned signum) { }
|
175 kumpf 1.14
176 void SignalHandler::deactivateAll() { }
177
|
178 david.dillard 1.24 void SignalHandler::ignore(unsigned signum) { }
|
179 kumpf 1.14
|
180 mateus.baur 1.33 void SignalHandler::defaultAction(unsigned signum) { }
181
|
182 kumpf 1.14 #endif // PEGASUS_HAS_SIGNALS
|
183 mike 1.2
184
185 // export the global signal handling object
186
187 SignalHandler _globalSignalHandler;
188 SignalHandler * _globalSignalHandlerPtr = &_globalSignalHandler;
189 SignalHandler * getSigHandle() { return _globalSignalHandlerPtr; }
190
191
192 PEGASUS_NAMESPACE_END
|