diff --git a/CONTRIBUTORS b/CONTRIBUTORS index e42fb982..e13b6c08 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -188,6 +188,7 @@ Stefan Huelswitt for reporting a bug in setting the title in the replay display of the "Classic VDR" skin in case a shorter title is set after a longer one for fixing handling of pmAudioOnlyBlack + for pointing out possible race conditions in handling childTid in cThread Ulrich Röder for pointing out that there are channels that have a symbol rate higher than diff --git a/HISTORY b/HISTORY index 271353bd..767b1fd7 100644 --- a/HISTORY +++ b/HISTORY @@ -3159,3 +3159,5 @@ Video Disk Recorder Revision History overhead in the firmware (thanks to Werner Fink). - Now checking available OSD memory at runtime (thanks to Oliver Endriss). - Fixed some typos in the Makefile's 'font' target (thanks to Olaf Titz). +- Fixed handling childTid in cThread to avoid possible race conditions (thanks + to Stefan Huelswitt for pointing this out). diff --git a/thread.c b/thread.c index 080be0e0..7045e5ad 100644 --- a/thread.c +++ b/thread.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.36 2004/10/31 09:54:02 kls Exp $ + * $Id: thread.c 1.37 2004/11/20 16:21:14 kls Exp $ */ #include "thread.h" @@ -233,12 +233,15 @@ void *cThread::StartThread(cThread *Thread) bool cThread::Start(void) { + Lock(); if (!childTid) { parentTid = pthread_self(); - pthread_create(&childTid, NULL, (void *(*) (void *))&StartThread, (void *)this); - pthread_detach(childTid); // auto-reap - pthread_setschedparam(childTid, SCHED_RR, 0); + pthread_t Tid; + pthread_create(&Tid, NULL, (void *(*) (void *))&StartThread, (void *)this); + pthread_detach(Tid); // auto-reap + pthread_setschedparam(Tid, SCHED_RR, 0); } + Unlock(); return true; //XXX return value of pthread_create()??? } @@ -277,10 +280,12 @@ void cThread::Cancel(int WaitSeconds) } esyslog("ERROR: thread %ld won't end (waited %d seconds) - cancelling it...", childTid, WaitSeconds); } + Lock(); if (childTid) { pthread_cancel(childTid); childTid = 0; } + Unlock(); } }