diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2002-08-16 18:00:00 +0200 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2002-08-16 18:00:00 +0200 |
commit | ed643353b100bee75459c4ef2d0330e7a04e1f2a (patch) | |
tree | 8a424eba464677a71309e1125ce4e7acef58607e /thread.c | |
parent | 527748826c8d3cfacff8a7ab3fda9551c1182590 (diff) | |
download | vdr-patch-lnbsharing-ed643353b100bee75459c4ef2d0330e7a04e1f2a.tar.gz vdr-patch-lnbsharing-ed643353b100bee75459c4ef2d0330e7a04e1f2a.tar.bz2 |
Version 1.1.7vdr-1.1.7
- Adapted VDR to the NEWSTRUCT driver. To use the new driver, compile VDR with
'make NEWSTRUCT=1' (thanks to Holger Wächtler for some valuable advice).
By default it currently still uses the old driver.
- Added some missing #includes (thanks to Martin Hammerschmid).
- Changed the log error message "can't record MPEG1!" to "error in data stream!",
since the mentioning of MPEG1 has irritated many people.
- Consistently using malloc/free and new/delete (thanks to Andreas Schultz).
- Temporarily made cDevice::ProvidesCa() virtual (Andreas Schultz needs this
in his DXR3 plugin).
- cDevice no longer exposes a file handle to cPlayer. A derived cPlayer class
can now call DevicePoll() to see whether the replay device is ready for
further data. A derived cDevice class must implement Poll() and shall
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).
- VDR no longer gives up if there is no DVB device. It continues to work if
there is at least one device, either a DVB device found by the core VDR code
itself, or a device implemented by a plugin.
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 42 |
1 files changed, 34 insertions, 8 deletions
@@ -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/01 15:28:46 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; |