From 3540d18855d68434d4ab83bc55e590cc6898b175 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Thu, 15 Aug 2002 11:46:22 +0200 Subject: [PATCH] Improved cCondVar::Wait() and implemented cCondVar::TimedWait() --- CONTRIBUTORS | 1 + HISTORY | 2 ++ thread.c | 42 ++++++++++++++++++++++++++++++++++-------- thread.h | 6 +++--- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index e39f3021..fedc49a3 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -141,6 +141,7 @@ Stefan Huelswitt for suggesting to add an error message if the directory specified in the '-L' option can't be accessed for implementing several replay modes to allow players that play only audio + for improving cCondVar::Wait() and implementing cCondVar::TimedWait() Ulrich Röder for pointing out that there are channels that have a symbol rate higher than diff --git a/HISTORY b/HISTORY index a145e521..7ab0708f 100644 --- a/HISTORY +++ b/HISTORY @@ -1410,3 +1410,5 @@ Video Disk Recorder Revision History check if any of its file handles is ready for data. - Implemented several replay modes to allow players that play only audio (thanks to Stefan Huelswitt). +- Improved cCondVar::Wait() and implemented cCondVar::TimedWait() (thanks to + Stefan Huelswitt). diff --git a/thread.c b/thread.c index 3db0f908..0f42e56c 100644 --- a/thread.c +++ b/thread.c @@ -4,13 +4,14 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.21 2002/06/10 16:30:00 kls Exp $ + * $Id: thread.c 1.22 2002/08/15 11:44:48 kls Exp $ */ #include "thread.h" #include #include #include +#include #include #include #include "tools.h" @@ -27,17 +28,43 @@ cCondVar::~cCondVar() pthread_cond_destroy(&cond); } -bool cCondVar::Wait(cMutex &Mutex) +void cCondVar::Wait(cMutex &Mutex) { - return pthread_cond_wait(&cond, &Mutex.mutex); + if (Mutex.locked && Mutex.lockingPid == getpid()) { + int locked = Mutex.locked; + Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_wait + // does an implizit unlock of the mutex + pthread_cond_wait(&cond, &Mutex.mutex); + Mutex.locked = locked; + } } -/* -bool cCondVar::TimedWait(cMutex &Mutex, unsigned long tmout) +bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs) { - return pthread_cond_timedwait(&cond, &Mutex.mutex, tmout); + bool r = true; // true = condition signaled false = timeout + + if (Mutex.locked && Mutex.lockingPid == getpid()) { + struct timeval now; // unfortunately timedwait needs the absolute time, not the delta :-( + if (gettimeofday(&now, NULL) == 0) { // get current time + now.tv_usec += TimeoutMs * 1000; // add the timeout + while (now.tv_usec >= 1000000) { // take care of an overflow + now.tv_sec++; + now.tv_usec -= 1000000; + } + struct timespec abstime; // build timespec for timedwait + abstime.tv_sec = now.tv_sec; // seconds + abstime.tv_nsec = now.tv_usec * 1000; // nano seconds + + int locked = Mutex.locked; + Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_timedwait + // does an implizit unlock of the mutex. + if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT) + r = false; + Mutex.locked = locked; + } + } + return r; } -*/ void cCondVar::Broadcast(void) { @@ -344,7 +371,6 @@ int cPipe::Close(void) i--; usleep(100000); } - if (!i) { kill(pid, SIGKILL); ret = -1; diff --git a/thread.h b/thread.h index d9c8f3a6..9fc48b64 100644 --- a/thread.h +++ b/thread.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.h 1.13 2002/06/10 16:30:00 kls Exp $ + * $Id: thread.h 1.14 2002/08/15 11:40:06 kls Exp $ */ #ifndef __THREAD_H @@ -22,8 +22,8 @@ private: public: cCondVar(void); ~cCondVar(); - bool Wait(cMutex &Mutex); - //bool TimedWait(cMutex &Mutex, unsigned long tmout); + void Wait(cMutex &Mutex); + bool TimedWait(cMutex &Mutex, int TimeoutMs); void Broadcast(void); //void Signal(void); };