(file) Return to Signal.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2