summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c60
1 files changed, 59 insertions, 1 deletions
diff --git a/thread.c b/thread.c
index 363190d..e253ea0 100644
--- a/thread.c
+++ b/thread.c
@@ -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)