diff options
| author | Klaus Schmidinger <vdr@tvdr.de> | 2002-08-15 11:46:22 +0200 | 
|---|---|---|
| committer | Klaus Schmidinger <vdr@tvdr.de> | 2002-08-15 11:46:22 +0200 | 
| commit | 3540d18855d68434d4ab83bc55e590cc6898b175 (patch) | |
| tree | 02d5b91c25ad71709203159d1eb91c182d073d01 | |
| parent | ac471850fe5d7f5267e991eb3d2ed3d5488fe502 (diff) | |
| download | vdr-3540d18855d68434d4ab83bc55e590cc6898b175.tar.gz vdr-3540d18855d68434d4ab83bc55e590cc6898b175.tar.bz2 | |
Improved cCondVar::Wait() and implemented cCondVar::TimedWait()
| -rw-r--r-- | CONTRIBUTORS | 1 | ||||
| -rw-r--r-- | HISTORY | 2 | ||||
| -rw-r--r-- | thread.c | 42 | ||||
| -rw-r--r-- | thread.h | 6 | 
4 files changed, 40 insertions, 11 deletions
| diff --git a/CONTRIBUTORS b/CONTRIBUTORS index e39f3021..fedc49a3 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -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 @@ -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). @@ -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; @@ -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);    }; | 
