summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2002-08-16 18:00:00 +0200
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2002-08-16 18:00:00 +0200
commited643353b100bee75459c4ef2d0330e7a04e1f2a (patch)
tree8a424eba464677a71309e1125ce4e7acef58607e /thread.c
parent527748826c8d3cfacff8a7ab3fda9551c1182590 (diff)
downloadvdr-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.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/thread.c b/thread.c
index 1448cd8..0f42e56 100644
--- a/thread.c
+++ b/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/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;