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:
parent
ac471850fe
commit
3540d18855
@ -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
|
||||
|
2
HISTORY
2
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).
|
||||
|
42
thread.c
42
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 <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;
|
||||
|
6
thread.h
6
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);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user