1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Improved cCondVar::Wait() and implemented cCondVar::TimedWait()

This commit is contained in:
Klaus Schmidinger 2002-08-15 11:46:22 +02:00
parent ac471850fe
commit 3540d18855
4 changed files with 40 additions and 11 deletions

View File

@ -141,6 +141,7 @@ Stefan Huelswitt <huels@iname.com>
for suggesting to add an error message if the directory specified in the '-L' for suggesting to add an error message if the directory specified in the '-L'
option can't be accessed option can't be accessed
for implementing several replay modes to allow players that play only audio for implementing several replay modes to allow players that play only audio
for improving cCondVar::Wait() and implementing cCondVar::TimedWait()
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

@ -1410,3 +1410,5 @@ Video Disk Recorder Revision History
check if any of its file handles is ready for data. check if any of its file handles is ready for data.
- Implemented several replay modes to allow players that play only audio (thanks - Implemented several replay modes to allow players that play only audio (thanks
to Stefan Huelswitt). to Stefan Huelswitt).
- Improved cCondVar::Wait() and implemented cCondVar::TimedWait() (thanks to
Stefan Huelswitt).

View File

@ -4,13 +4,14 @@
* 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.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 "thread.h"
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <sys/time.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <unistd.h> #include <unistd.h>
#include "tools.h" #include "tools.h"
@ -27,17 +28,43 @@ cCondVar::~cCondVar()
pthread_cond_destroy(&cond); 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, int TimeoutMs)
bool cCondVar::TimedWait(cMutex &Mutex, unsigned long tmout)
{ {
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) void cCondVar::Broadcast(void)
{ {
@ -344,7 +371,6 @@ int cPipe::Close(void)
i--; i--;
usleep(100000); usleep(100000);
} }
if (!i) { if (!i) {
kill(pid, SIGKILL); kill(pid, SIGKILL);
ret = -1; ret = -1;

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.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 #ifndef __THREAD_H
@ -22,8 +22,8 @@ private:
public: public:
cCondVar(void); cCondVar(void);
~cCondVar(); ~cCondVar();
bool Wait(cMutex &Mutex); void Wait(cMutex &Mutex);
//bool TimedWait(cMutex &Mutex, unsigned long tmout); bool TimedWait(cMutex &Mutex, int TimeoutMs);
void Broadcast(void); void Broadcast(void);
//void Signal(void); //void Signal(void);
}; };