mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Improved cCondVar::Wait() and implemented cCondVar::TimedWait()
This commit is contained in:
		| @@ -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); | ||||
|   }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user