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'
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 <roeder@efr-net.de>
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.
- 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).

View File

@ -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 <errno.h>
#include <signal.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <unistd.h>
#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;

View File

@ -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);
};