mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Added some checks when cancelling a thread and removed the usleep() in cThread::Start(); removed 'running' from cThread
This commit is contained in:
		| @@ -742,6 +742,8 @@ Ludwig Nussel <ludwig.nussel@web.de> | |||||||
|  for reporting a problem on systems that have UTF-8 enabled |  for reporting a problem on systems that have UTF-8 enabled | ||||||
|  for pointing out a flaw in the the description of cRingBufferLinear |  for pointing out a flaw in the the description of cRingBufferLinear | ||||||
|  for reporting a bug in cRingBufferLinear::Get() in case the buffer wraps around |  for reporting a bug in cRingBufferLinear::Get() in case the buffer wraps around | ||||||
|  |  for adding some checks when cancelling a thread and removing the usleep() in | ||||||
|  |  cThread::Start() | ||||||
|  |  | ||||||
| Thomas Koch <tom@harhar.net> | Thomas Koch <tom@harhar.net> | ||||||
|  for his support in keeping the Premiere World channels up to date in 'channels.conf' |  for his support in keeping the Premiere World channels up to date in 'channels.conf' | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -3065,3 +3065,7 @@ Video Disk Recorder Revision History | |||||||
|   small packet. |   small packet. | ||||||
| - Removed the signal handler and WakeUp() call from cThread (it is no longer | - Removed the signal handler and WakeUp() call from cThread (it is no longer | ||||||
|   needed). |   needed). | ||||||
|  | - Added some checks when cancelling a thread and removed the usleep() in | ||||||
|  |   cThread::Start() (suggested by Ludwig Nussel). Also removed 'running' from | ||||||
|  |   cThread and using only childTid to indicate whether a thread is actually | ||||||
|  |   running. | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								thread.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								thread.c
									
									
									
									
									
								
							| @@ -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.c 1.33 2004/10/24 09:47:57 kls Exp $ |  * $Id: thread.c 1.34 2004/10/24 10:27:47 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "thread.h" | #include "thread.h" | ||||||
| @@ -189,7 +189,6 @@ bool cThread::emergencyExitRequested = false; | |||||||
|  |  | ||||||
| cThread::cThread(const char *Description) | cThread::cThread(const char *Description) | ||||||
| { | { | ||||||
|   running = false; |  | ||||||
|   parentTid = childTid = 0; |   parentTid = childTid = 0; | ||||||
|   description = NULL; |   description = NULL; | ||||||
|   SetDescription(Description); |   SetDescription(Description); | ||||||
| @@ -226,13 +225,11 @@ void *cThread::StartThread(cThread *Thread) | |||||||
|  |  | ||||||
| bool cThread::Start(void) | bool cThread::Start(void) | ||||||
| { | { | ||||||
|   if (!running) { |   if (!childTid) { | ||||||
|      running = true; |  | ||||||
|      parentTid = pthread_self(); |      parentTid = pthread_self(); | ||||||
|      pthread_create(&childTid, NULL, (void *(*) (void *))&StartThread, (void *)this); |      pthread_create(&childTid, NULL, (void *(*) (void *))&StartThread, (void *)this); | ||||||
|      pthread_detach(childTid); // auto-reap |      pthread_detach(childTid); // auto-reap | ||||||
|      pthread_setschedparam(childTid, SCHED_RR, 0); |      pthread_setschedparam(childTid, SCHED_RR, 0); | ||||||
|      usleep(10000); // otherwise calling Active() immediately after Start() causes a "pure virtual method called" error |  | ||||||
|      } |      } | ||||||
|   return true; //XXX return value of pthread_create()??? |   return true; //XXX return value of pthread_create()??? | ||||||
| } | } | ||||||
| @@ -263,7 +260,7 @@ bool cThread::Active(void) | |||||||
|  |  | ||||||
| void cThread::Cancel(int WaitSeconds) | void cThread::Cancel(int WaitSeconds) | ||||||
| { | { | ||||||
|   running = false; |   if (childTid) { | ||||||
|      if (WaitSeconds > 0) { |      if (WaitSeconds > 0) { | ||||||
|         for (time_t t0 = time(NULL) + WaitSeconds; time(NULL) < t0; ) { |         for (time_t t0 = time(NULL) + WaitSeconds; time(NULL) < t0; ) { | ||||||
|             if (!Active()) |             if (!Active()) | ||||||
| @@ -272,7 +269,11 @@ void cThread::Cancel(int WaitSeconds) | |||||||
|             } |             } | ||||||
|         esyslog("ERROR: thread %ld won't end (waited %d seconds) - cancelling it...", childTid, WaitSeconds); |         esyslog("ERROR: thread %ld won't end (waited %d seconds) - cancelling it...", childTid, WaitSeconds); | ||||||
|         } |         } | ||||||
|  |      if (childTid) { | ||||||
|         pthread_cancel(childTid); |         pthread_cancel(childTid); | ||||||
|  |         childTid = 0; | ||||||
|  |         } | ||||||
|  |      } | ||||||
| } | } | ||||||
|  |  | ||||||
| bool cThread::EmergencyExit(bool Request) | bool cThread::EmergencyExit(bool Request) | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								thread.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								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.22 2004/10/24 09:46:36 kls Exp $ |  * $Id: thread.h 1.23 2004/10/24 10:28:48 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef __THREAD_H | #ifndef __THREAD_H | ||||||
| @@ -71,7 +71,6 @@ class cThread { | |||||||
| private: | private: | ||||||
|   pthread_t parentTid, childTid; |   pthread_t parentTid, childTid; | ||||||
|   cMutex mutex; |   cMutex mutex; | ||||||
|   bool running; |  | ||||||
|   char *description; |   char *description; | ||||||
|   static bool emergencyExitRequested; |   static bool emergencyExitRequested; | ||||||
|   static void *StartThread(cThread *Thread); |   static void *StartThread(cThread *Thread); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user