summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/thread.c b/thread.c
index 363190d8..aa6ed64c 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.8 2001/05/25 09:37:00 kls Exp $
*/
#include "thread.h"
@@ -14,12 +14,41 @@
#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.
bool cThread::signalHandlerInstalled = false;
+bool cThread::emergencyExitRequested = false;
cThread::cThread(void)
{
@@ -110,6 +139,14 @@ void cThread::WakeUp(void)
kill(parentPid, SIGIO); // makes any waiting 'select()' call return immediately
}
+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)