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

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2