summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2001-06-02 10:47:40 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2001-06-02 10:47:40 +0200
commitc40e4eb96e43963845d1de1678a317b27e77f04e (patch)
treefc61866ba83db4bb0611cb45f1bd951eeeb56bd7 /thread.c
parent1ef2b1d3a149348539565902825bb168a52673a1 (diff)
downloadvdr-c40e4eb96e43963845d1de1678a317b27e77f04e.tar.gz
vdr-c40e4eb96e43963845d1de1678a317b27e77f04e.tar.bz2
Converted to the new API plus several small enhancements0.8.0
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)