[go: up one dir, main page]

Menu

[ab7a0e]: / libgnuworld / Signal.h  Maximize  Restore  History

Download this file

133 lines (110 with data), 3.3 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* Signal.h
* Author: Daniel Karrels dan@karrels.com
* Copyright (C) 2003 Daniel Karrels <dan@karrels.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* $Id: Signal.h,v 1.5 2003/12/17 18:21:36 dan_karrels Exp $
*/
#ifndef __SIGNAL_H
#define __SIGNAL_H "$Id: Signal.h,v 1.5 2003/12/17 18:21:36 dan_karrels Exp $"
#include <pthread.h>
namespace gnuworld
{
/**
* A class used to safely handle asynchronous (non-realtime) signals.
* It uses a nonblocking pipe (rather than other solutions, see
* my thesis) to solve the multiple consumer, single nonblocking
* producer p/c problem.
*/
class Signal
{
protected:
/**
* This variable is true if there exists an uncoverable error.
*/
static bool signalError ;
/**
* The FD for the read side of the pipe.
*/
static int readFD ;
/**
* The FD for the write side of the pipe.
*/
static int writeFD ;
/**
* A mutex to guard access to the Singleton.
*/
static pthread_mutex_t singletonMutex ;
/**
* The Singleton instance.
*/
static Signal* theInstance ;
/**
* This mutex guards from multiple threads performing a get()
*/
static pthread_mutex_t pipeMutex ;
public:
/**
* Release resources associated with this class.
*/
virtual ~Signal() ;
/**
* Retrieve the Singleton instance of this class, creating
* it if necessary.
* Once an instance is created, all signals currently
* supported by this class will be remapped to this subsystem.
*/
static Signal* getInstance() ;
/**
* Add a signal to the signal queue.
* This method is meant to be called *only* from the
* asynchronous signal handler.
*/
static void AddSignal( int whichSig ) ;
/**
* The semantics of the return statement are a little backwards here:
* - true indicates that the caller should check the value of
* theSignal for either a new signal or an error state (-1)
* - false indicates that no error and no signal are ready
*/
static bool getSignal( int& theSignal ) ;
/**
* This method will return true if there is a non-recoverable
* error in the signal handler subsystem.
*/
static bool isError() ;
private:
/**
* Private constructor, make this class a Singleton.
*/
Signal() ;
protected:
/**
* Convenience method to close the pipes when a critical
* error occurs. In this case, signalError will remain
* set, and both pipes are invalid, no signal delivery
* will occur.
*/
static void closePipes() ;
/**
* Opens both pipes, and configures in nonblocking mode.
*/
static bool openPipes() ;
} ;
} // namespace gnuworld
#endif // __SIGNAL_H