From 6f93a5f7819b3c7030a5b199e502bedd4eb7844c Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 24 Oct 2004 18:00:00 +0200 Subject: =?UTF-8?q?Version=201.3.14=20-=20Fixed=20detecting=20transponder?= =?UTF-8?q?=20lock=20in=20cDvbTuner=20(based=20on=20a=20patch=20from=20Ste?= =?UTF-8?q?fan=20=20=20Meyknecht).=20-=20What=20was=20previously=20marked?= =?UTF-8?q?=20with=20WAIT=5FFOR=5FLOCK=5FAFTER=5FTUNING=20is=20now=20perma?= =?UTF-8?q?nently=20=20=20active=20and=20uses=20a=20cCondVar=20to=20signal?= =?UTF-8?q?=20when=20a=20transponder=20is=20locked.=20-=20Added=20some=20m?= =?UTF-8?q?issing=20'const'=20to=20cChannel.=20-=20Added=20a=20sample=20se?= =?UTF-8?q?tup=20for=20'DisiCon-4=20Single=20Cable=20Network'=20to=20'dise?= =?UTF-8?q?qc.conf'=20=20=20(thanks=20to=20Oliver=20Endriss).=20-=20Fixed?= =?UTF-8?q?=20attaching=20a=20cPlayer=20to=20a=20cDevice,=20so=20that=20'O?= =?UTF-8?q?peration=20not=20permitted'=20=20=20errors=20don't=20occur=20an?= =?UTF-8?q?y=20more=20(thanks=20to=20Marco=20Schl=C3=BC=C3=9Fler).=20-=20F?= =?UTF-8?q?ixed=20a=20case=20where=20the=20resultBuffer=20in=20cRemux=20ra?= =?UTF-8?q?n=20full=20before=20getting=20a=20sync.=20-=20Removed=20the=20u?= =?UTF-8?q?sleep()=20call=20from=20cDvbPlayer::Action()=20to=20make=20VDR?= =?UTF-8?q?=20run=20on=20NPTL=20=20=20systems=20(thanks=20to=20Alfred=20Za?= =?UTF-8?q?strow).=20The=20NPTL=20check=20at=20startup=20has=20also=20been?= =?UTF-8?q?=20=20=20removed.=20-=20Taking=20the=20complete=20size=20of=20a?= =?UTF-8?q?vailable=20data=20into=20account=20when=20deciding=20whether=20?= =?UTF-8?q?=20=20to=20clear=20the=20transfer=20buffer=20to=20avoid=20overf?= =?UTF-8?q?lows=20(thanks=20to=20Reinhard=20Nissl).=20-=20Updated=20Romani?= =?UTF-8?q?an=20language=20texts=20and=20the=20iso8859-2=20fonts=20(thanks?= =?UTF-8?q?=20to=20Lucian=20Muresan).=20-=20Now=20actually=20using=20the?= =?UTF-8?q?=20iso8859-15=20fonts=20(thanks=20to=20Lucian=20Muresan).=20-?= =?UTF-8?q?=20Some=20minor=20code=20cleanups=20(thanks=20to=20Prakash=20K.?= =?UTF-8?q?=20Cheemplavam).=20-=20Fixed=20missing=20cleanup=20at=20program?= =?UTF-8?q?=20exit=20in=20case=20there=20is=20a=20problem=20with=20a=20plu?= =?UTF-8?q?gin=20=20=20(thanks=20to=20Mattias=20Gr=C3=B6nlund=20for=20poin?= =?UTF-8?q?ting=20this=20out).=20-=20Increased=20the=20required=20free=20b?= =?UTF-8?q?uffer=20space=20in=20the=20resultBuffer=20of=20cRemux=20to=20?= =?UTF-8?q?=20=202=20*=20IPACKS=20to=20avoid=20a=20buffer=20overflow=20in?= =?UTF-8?q?=20case=20a=20cTS2PES=20writes=20one=20complete=20=20=20packet?= =?UTF-8?q?=20and=20then=20(within=20processing=20the=20same=20TS=20packet?= =?UTF-8?q?)=20wants=20to=20write=20another=20=20=20small=20packet.=20-=20?= =?UTF-8?q?Removed=20the=20signal=20handler=20and=20WakeUp()=20call=20from?= =?UTF-8?q?=20cThread=20(it=20is=20no=20longer=20=20=20needed).=20-=20Adde?= =?UTF-8?q?d=20some=20checks=20when=20canceling=20a=20thread=20and=20remov?= =?UTF-8?q?ed=20the=20usleep()=20in=20=20=20cThread::Start()=20(suggested?= =?UTF-8?q?=20by=20Ludwig=20Nussel).=20Also=20removed=20'running'=20from?= =?UTF-8?q?=20=20=20cThread=20and=20using=20only=20childTid=20to=20indicat?= =?UTF-8?q?e=20whether=20a=20thread=20is=20actually=20=20=20running.=20-?= =?UTF-8?q?=20Added=20cCondWait::Sleep()=20and=20using=20it=20to=20replace?= =?UTF-8?q?=20all=20usleep()=20calls=20(based=20=20=20on=20a=20suggestion?= =?UTF-8?q?=20by=20Werner=20Fink).=20-=20Only=20assigning=20events=20to=20?= =?UTF-8?q?timers=20if=20the=20related=20schedule=20has=20actually=20been?= =?UTF-8?q?=20=20=20modified.=20-=20When=20searching=20for=20the=20present?= =?UTF-8?q?=20event,=20the=20running=20status=20is=20now=20only=20taken=20?= =?UTF-8?q?=20=20into=20account=20if=20the=20event=20has=20been=20"seen"?= =?UTF-8?q?=20within=20the=20past=2030=20seconds.=20=20=20This=20avoids=20?= =?UTF-8?q?shortly=20seeing=20the=20wrong=20events=20in=20the=20channel=20?= =?UTF-8?q?display=20when=20=20=20switching=20to=20a=20channel=20that=20ha?= =?UTF-8?q?sn't=20been=20tuned=20to=20in=20a=20while.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- thread.c | 56 ++++++++++++++++++++++---------------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) (limited to 'thread.c') diff --git a/thread.c b/thread.c index 64b944b..144563d 100644 --- a/thread.c +++ b/thread.c @@ -4,13 +4,12 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.32 2004/10/15 13:15:02 kls Exp $ + * $Id: thread.c 1.35 2004/10/24 11:05:56 kls Exp $ */ #include "thread.h" #include #include -#include #include #include #include @@ -33,6 +32,12 @@ cCondWait::~cCondWait() pthread_mutex_destroy(&mutex); } +void cCondWait::SleepMs(int TimeoutMs) +{ + cCondWait w; + w.Wait(TimeoutMs); +} + bool cCondWait::Wait(int TimeoutMs) { pthread_mutex_lock(&mutex); @@ -186,19 +191,10 @@ void cMutex::Unlock(void) // --- cThread --------------------------------------------------------------- -// The signal handler is necessary to be able to use SIGIO to wake up any -// pending 'select()' call. - -bool cThread::signalHandlerInstalled = false; bool cThread::emergencyExitRequested = false; cThread::cThread(const char *Description) { - if (!signalHandlerInstalled) { - signal(SIGIO, SignalHandler); - signalHandlerInstalled = true; - } - running = false; parentTid = childTid = 0; description = NULL; SetDescription(Description); @@ -221,11 +217,6 @@ void cThread::SetDescription(const char *Description, ...) } } -void cThread::SignalHandler(int signum) -{ - signal(signum, SignalHandler); -} - void *cThread::StartThread(cThread *Thread) { Thread->childTid = pthread_self(); @@ -240,13 +231,11 @@ void *cThread::StartThread(cThread *Thread) bool cThread::Start(void) { - if (!running) { - running = true; + 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); - usleep(10000); // otherwise calling Active() immediately after Start() causes a "pure virtual method called" error } return true; //XXX return value of pthread_create()??? } @@ -277,21 +266,20 @@ bool cThread::Active(void) void cThread::Cancel(int WaitSeconds) { - running = false; - if (WaitSeconds > 0) { - for (time_t t0 = time(NULL) + WaitSeconds; time(NULL) < t0; ) { - if (!Active()) - return; - usleep(10000); - } - esyslog("ERROR: thread %ld won't end (waited %d seconds) - cancelling it...", childTid, WaitSeconds); + if (childTid) { + if (WaitSeconds > 0) { + for (time_t t0 = time(NULL) + WaitSeconds; time(NULL) < t0; ) { + if (!Active()) + return; + cCondWait::SleepMs(10); + } + esyslog("ERROR: thread %ld won't end (waited %d seconds) - cancelling it...", childTid, WaitSeconds); + } + if (childTid) { + pthread_cancel(childTid); + childTid = 0; + } } - pthread_cancel(childTid); -} - -void cThread::WakeUp(void) -{ - pthread_kill(parentTid, SIGIO); // makes any waiting 'select()' call return immediately } bool cThread::EmergencyExit(bool Request) @@ -451,7 +439,7 @@ int cPipe::Close(void) else if (ret == pid) break; i--; - usleep(100000); + cCondWait::SleepMs(100); } if (!i) { kill(pid, SIGKILL); -- cgit v1.2.3