diff options
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 60 |
1 files changed, 59 insertions, 1 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.7 2000/12/24 12:27:21 kls Exp $ + * $Id: thread.c 1.9 2001/06/27 11:34:41 kls Exp $ */ #include "thread.h" @@ -14,12 +14,43 @@ #include <unistd.h> #include "tools.h" +// --- cMutex ---------------------------------------------------------------- + +cMutex::cMutex(void) +{ + lockingPid = 0; + locked = 0; + pthread_mutex_init(&mutex, NULL); +} + +cMutex::~cMutex() +{ + pthread_mutex_destroy(&mutex); +} + +void cMutex::Lock(void) +{ + if (getpid() != lockingPid || !locked) + pthread_mutex_lock(&mutex); + lockingPid = getpid(); + locked++; +} + +void cMutex::Unlock(void) +{ + if (!--locked) + pthread_mutex_unlock(&mutex); +} + // --- cThread --------------------------------------------------------------- // The signal handler is necessary to be able to use SIGIO to wake up any // pending 'select()' call. +time_t cThread::lastPanic = 0; +int cThread::panicLevel = 0; bool cThread::signalHandlerInstalled = false; +bool cThread::emergencyExitRequested = false; cThread::cThread(void) { @@ -110,6 +141,33 @@ void cThread::WakeUp(void) kill(parentPid, SIGIO); // makes any waiting 'select()' call return immediately } +#define MAXPANICLEVEL 10 + +void cThread::RaisePanic(void) +{ + if (lastPanic > 0) { + if (time(NULL) - lastPanic < 5) + panicLevel++; + else if (panicLevel > 0) + panicLevel--; + } + lastPanic = time(NULL); + if (panicLevel > MAXPANICLEVEL) { + esyslog(LOG_ERR, "ERROR: max. panic level exceeded"); + EmergencyExit(true); + } + else + dsyslog(LOG_INFO, "panic level: %d", panicLevel); +} + +bool cThread::EmergencyExit(bool Request) +{ + if (!Request) + return emergencyExitRequested; + esyslog(LOG_ERR, "initiating emergency exit"); + return emergencyExitRequested = true; // yes, it's an assignment, not a comparison! +} + // --- cThreadLock ----------------------------------------------------------- cThreadLock::cThreadLock(cThread *Thread) |