Mutexes are now created with PTHREAD_MUTEX_ERRORCHECK_NP

This commit is contained in:
Klaus Schmidinger 2003-10-18 13:20:01 +02:00
parent b658b1fe16
commit e7b6b2fff7
4 changed files with 12 additions and 15 deletions

View File

@ -178,6 +178,8 @@ Stefan Huelswitt <huels@iname.com>
for fixing a possible access of invalid file handles in cSIProcessor::Action() for fixing a possible access of invalid file handles in cSIProcessor::Action()
for fixing extracting the ES data in cDvbDevice::StillPicture() for fixing extracting the ES data in cDvbDevice::StillPicture()
for changing thread handling to make it work with NPTL ("Native Posix Thread Library") for changing thread handling to make it work with NPTL ("Native Posix Thread Library")
for creating mutexes with PTHREAD_MUTEX_ERRORCHECK_NP, which made the 'lockingTid'
stuff obsolete
Ulrich Röder <roeder@efr-net.de> Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than for pointing out that there are channels that have a symbol rate higher than

View File

@ -2446,3 +2446,5 @@ Video Disk Recorder Revision History
instead of explicit 'dsyslog()' calls inside their Action() function in order instead of explicit 'dsyslog()' calls inside their Action() function in order
to support logging the thread ids. to support logging the thread ids.
- Added "Slovak Link" and "Czech Link" to 'ca.conf' (thanks to Emil Petersky). - Added "Slovak Link" and "Czech Link" to 'ca.conf' (thanks to Emil Petersky).
- Mutexes are now created with PTHREAD_MUTEX_ERRORCHECK_NP, which makes the
'lockingTid' stuff obsolete (thanks to Stefan Huelswitt).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: thread.c 1.27 2003/10/18 12:14:55 kls Exp $ * $Id: thread.c 1.28 2003/10/18 13:00:04 kls Exp $
*/ */
#include "thread.h" #include "thread.h"
@ -32,7 +32,7 @@ cCondVar::~cCondVar()
void cCondVar::Wait(cMutex &Mutex) void cCondVar::Wait(cMutex &Mutex)
{ {
if (Mutex.locked && pthread_equal(Mutex.lockingTid, pthread_self())) { if (Mutex.locked) {
int locked = Mutex.locked; int locked = Mutex.locked;
Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_wait Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_wait
// does an implizit unlock of the mutex // does an implizit unlock of the mutex
@ -45,7 +45,7 @@ bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs)
{ {
bool r = true; // true = condition signaled false = timeout bool r = true; // true = condition signaled false = timeout
if (Mutex.locked && pthread_equal(Mutex.lockingTid, pthread_self())) { if (Mutex.locked) {
struct timeval now; // unfortunately timedwait needs the absolute time, not the delta :-( struct timeval now; // unfortunately timedwait needs the absolute time, not the delta :-(
if (gettimeofday(&now, NULL) == 0) { // get current time if (gettimeofday(&now, NULL) == 0) { // get current time
now.tv_usec += TimeoutMs * 1000; // add the timeout now.tv_usec += TimeoutMs * 1000; // add the timeout
@ -63,7 +63,6 @@ bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs)
if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT) if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT)
r = false; r = false;
Mutex.locked = locked; Mutex.locked = locked;
Mutex.lockingTid = pthread_self();
} }
} }
return r; return r;
@ -85,9 +84,9 @@ void cCondVar::Signal(void)
cMutex::cMutex(void) cMutex::cMutex(void)
{ {
lockingTid = 0;
locked = 0; locked = 0;
pthread_mutex_init(&mutex, NULL); pthread_mutexattr_t attr = { PTHREAD_MUTEX_ERRORCHECK_NP };
pthread_mutex_init(&mutex, &attr);
} }
cMutex::~cMutex() cMutex::~cMutex()
@ -97,19 +96,14 @@ cMutex::~cMutex()
void cMutex::Lock(void) void cMutex::Lock(void)
{ {
if (!pthread_equal(lockingTid, pthread_self()) || !locked) { pthread_mutex_lock(&mutex);
pthread_mutex_lock(&mutex);
lockingTid = pthread_self();
}
locked++; locked++;
} }
void cMutex::Unlock(void) void cMutex::Unlock(void)
{ {
if (!--locked) { if (!--locked)
lockingTid = 0;
pthread_mutex_unlock(&mutex); pthread_mutex_unlock(&mutex);
}
} }
// --- cThread --------------------------------------------------------------- // --- cThread ---------------------------------------------------------------

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: thread.h 1.17 2003/10/18 12:13:10 kls Exp $ * $Id: thread.h 1.18 2003/10/18 12:56:20 kls Exp $
*/ */
#ifndef __THREAD_H #ifndef __THREAD_H
@ -32,7 +32,6 @@ class cMutex {
friend class cCondVar; friend class cCondVar;
private: private:
pthread_mutex_t mutex; pthread_mutex_t mutex;
pthread_t lockingTid;
int locked; int locked;
public: public:
cMutex(void); cMutex(void);