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