1 karl 1.28 //%2006////////////////////////////////////////////////////////////////////////
|
2 kumpf 1.8 //
|
3 karl 1.20 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.16 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.20 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.26 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.28 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.2 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 kumpf 1.8 //
|
21 mike 1.2 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
|
34 kumpf 1.14 #include <cstdio>
35 #include <cstring>
|
36 keith.petley 1.15 #ifdef PEGASUS_PLATFORM_SOLARIS_SPARC_CC
|
37 tony 1.17 #include <iostream.h>
|
38 keith.petley 1.15 #endif
|
39 kumpf 1.14
|
40 mike 1.2 #include <Pegasus/Common/Config.h>
41 #include <Pegasus/Common/Signal.h>
|
42 david.dillard 1.22 #include <Pegasus/Common/Exception.h>
|
43 mike 1.2
|
44 kumpf 1.14 PEGASUS_USING_PEGASUS;
45
46 void sig_act(int s_n, PEGASUS_SIGINFO_T * s_info, void * sig)
|
47 mike 1.2 {
|
48 mike 1.29 ThreadReturnType retval = 0;
|
49 mike 1.2
|
50 kumpf 1.14 if (s_n == PEGASUS_SIGABRT)
51 {
52 printf("Received an abort signal\n");
|
53 chuck 1.27 #if defined(PEGASUS_HAS_SIGNALS) && !defined(PEGASUS_OS_OS400)
|
54 kumpf 1.14 printf(" in address %p\n", s_info->si_addr);
|
55 chuck 1.12 #endif
|
56 mike 1.2
|
57 kumpf 1.14 // In general it is dangerous to call pthread from within a
58 // signal handler, because they are not signal safe
|
59 mike 1.29 Threads::exit(retval);
|
60 kumpf 1.14 }
|
61 mike 1.2 }
62
63
|
64 kumpf 1.14 PEGASUS_NAMESPACE_BEGIN
|
65 mike 1.2
|
66 kumpf 1.14 #ifdef PEGASUS_HAS_SIGNALS
|
67 mike 1.2
|
68 david.dillard 1.21 SignalHandler::SignalHandler()
|
69 mike 1.2 {
|
70 kumpf 1.30 for (unsigned i = 0; i <= PEGASUS_NSIG; i++)
|
71 david.dillard 1.22 {
|
72 david.dillard 1.21 register_handler &rh = reg_handler[i];
73 rh.signum = i;
74 rh.active = 0;
75 rh.sh = NULL;
76 memset(&rh.oldsa,0,sizeof(struct sigaction));
|
77 david.dillard 1.22 }
|
78 mike 1.2 }
79
80 SignalHandler::~SignalHandler()
81 {
|
82 david.dillard 1.22 deactivateAll();
|
83 mike 1.2 }
84
|
85 david.dillard 1.24 void SignalHandler::verifySignum(unsigned signum)
|
86 david.dillard 1.21 {
87 if ( signum > PEGASUS_NSIG )
88 {
|
89 david.dillard 1.22 throw IndexOutOfBoundsException();
|
90 david.dillard 1.21 }
|
91 david.dillard 1.22 }
|
92 david.dillard 1.21
|
93 kumpf 1.30 SignalHandler::register_handler&
|
94 david.dillard 1.24 SignalHandler::getHandler(unsigned signum)
|
95 david.dillard 1.22 {
96 verifySignum(signum);
|
97 kumpf 1.30 return reg_handler[signum];
|
98 david.dillard 1.21 }
99
|
100 david.dillard 1.24 void SignalHandler::registerHandler(unsigned signum, signal_handler _sighandler)
|
101 mike 1.2 {
|
102 david.dillard 1.21 register_handler &rh = getHandler(signum);
|
103 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
104 david.dillard 1.21 deactivate_i(rh);
105 rh.sh = _sighandler;
|
106 mike 1.2 }
107
|
108 david.dillard 1.24 void SignalHandler::activate(unsigned signum)
|
109 mike 1.2 {
|
110 david.dillard 1.21 register_handler &rh = getHandler(signum);
|
111 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
112 david.dillard 1.21 if (rh.active)
113 {
114 return; // throw exception
115 }
|
116 mike 1.2
|
117 david.dillard 1.25 struct sigaction sig_acts;
|
118 mike 1.2
|
119 david.dillard 1.25 sig_acts.sa_sigaction = rh.sh;
120 sigfillset(&(sig_acts.sa_mask));
121 sig_acts.sa_flags = SA_SIGINFO;
|
122 mike 1.2
|
123 david.dillard 1.25 sigaction(signum, &sig_acts, &rh.oldsa);
|
124 mike 1.2
|
125 david.dillard 1.21 rh.active = -1;
|
126 mike 1.2 }
127
|
128 david.dillard 1.24 void SignalHandler::deactivate(unsigned signum)
|
129 mike 1.2 {
|
130 david.dillard 1.22 register_handler &rh = getHandler(signum);
|
131 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
132 david.dillard 1.21 deactivate_i(rh);
|
133 mike 1.2 }
134
|
135 david.dillard 1.21 void SignalHandler::deactivate_i(register_handler &rh)
|
136 mike 1.2 {
|
137 david.dillard 1.21 if (rh.active)
|
138 mike 1.2 {
|
139 david.dillard 1.21 rh.active = 0;
140 sigaction(rh.signum, &rh.oldsa, NULL);
|
141 mike 1.2 }
142 }
143
144 void SignalHandler::deactivateAll()
145 {
|
146 a.arora 1.19 AutoMutex autoMut(reg_mutex);
|
147 david.dillard 1.24 for (unsigned i=0; i <= PEGASUS_NSIG; i++)
|
148 david.dillard 1.21 {
149 register_handler &rh = reg_handler[i];
150 if (rh.active)
151 {
152 deactivate_i(rh);
153 }
154 }
|
155 mike 1.2 }
156
|
157 david.dillard 1.24 void SignalHandler::ignore(unsigned signum)
|
158 mike 1.2 {
|
159 david.dillard 1.21
|
160 david.dillard 1.22 verifySignum(signum);
|
161 david.dillard 1.21
|
162 kumpf 1.30 #if !defined(PEGASUS_PLATFORM_OS400_ISERIES_IBM) && \
|
163 mike 1.31 !defined(PEGASUS_OS_DARWIN)
|
164 david.dillard 1.22 sigignore(signum);
|
165 chuck 1.12 #else
|
166 david.dillard 1.25 struct sigaction sig_acts;
|
167 chuck 1.12
|
168 david.dillard 1.25 sig_acts.sa_handler = SIG_IGN;
169 sigfillset(&(sig_acts.sa_mask));
170 sig_acts.sa_flags = 0;
|
171 chuck 1.12
|
172 david.dillard 1.25 sigaction(signum, &sig_acts, NULL);
|
173 chuck 1.12 #endif
|
174 mike 1.2 }
|
175 kumpf 1.14
176 #else // PEGASUS_HAS_SIGNALS
177
178 SignalHandler::SignalHandler() { }
179
180 SignalHandler::~SignalHandler() { }
181
|
182 david.dillard 1.24 void SignalHandler::registerHandler(unsigned signum, signal_handler _sighandler)
|
183 kumpf 1.14 { }
184
|
185 david.dillard 1.24 void SignalHandler::activate(unsigned signum) { }
|
186 kumpf 1.14
|
187 david.dillard 1.24 void SignalHandler::deactivate(unsigned signum) { }
|
188 kumpf 1.14
189 void SignalHandler::deactivateAll() { }
190
|
191 david.dillard 1.24 void SignalHandler::ignore(unsigned signum) { }
|
192 kumpf 1.14
193 #endif // PEGASUS_HAS_SIGNALS
|
194 mike 1.2
195
196 // export the global signal handling object
197
198 SignalHandler _globalSignalHandler;
199 SignalHandler * _globalSignalHandlerPtr = &_globalSignalHandler;
200 SignalHandler * getSigHandle() { return _globalSignalHandlerPtr; }
201
202
203 PEGASUS_NAMESPACE_END
|