1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed a possible deadlock when using the 'Blue' button in the 'Schedules' menu to switch to an other channel

This commit is contained in:
Klaus Schmidinger 2003-03-16 11:17:46 +01:00
parent 8d4d7f2b62
commit 5261fd663f
3 changed files with 10 additions and 7 deletions

View File

@ -544,3 +544,7 @@ Jan Ekholm <chakie@infa.abo.fi>
Marcel Wiesweg <marcel.wiesweg@gmx.de> Marcel Wiesweg <marcel.wiesweg@gmx.de>
for pointing out a problem with high CPU load during replay for pointing out a problem with high CPU load during replay
for reporting broken support for raw OSDs of plugins for reporting broken support for raw OSDs of plugins
Torsten Herz <torsten.herz@web.de>
for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu
to switch to an other channel

View File

@ -1971,7 +1971,7 @@ Video Disk Recorder Revision History
reporting this one). reporting this one).
- Broken CAM connections are now restored automatically. - Broken CAM connections are now restored automatically.
2003-03-09: Version 1.1.26 2003-03-16: Version 1.1.26
- Removed signal handling and usleep(5000) from cDvbOsd::Cmd() (apparently this - Removed signal handling and usleep(5000) from cDvbOsd::Cmd() (apparently this
is no longer necessary with DVB driver 1.0.0pre2 or later). is no longer necessary with DVB driver 1.0.0pre2 or later).
@ -1980,3 +1980,5 @@ Video Disk Recorder Revision History
startup and uses the first one (if any) that actually has an MPEG decoder. startup and uses the first one (if any) that actually has an MPEG decoder.
That way this will also work automatically if the primary device is implemented That way this will also work automatically if the primary device is implemented
by a plugin. by a plugin.
- Fixed a possible deadlock when using the "Blue" button in the "Schedules" menu
to switch to an other channel (thanks to Torsten Herz).

9
eit.c
View File

@ -16,7 +16,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: eit.c 1.65 2003/02/02 15:41:03 kls Exp $ * $Id: eit.c 1.66 2003/03/16 11:14:35 kls Exp $
***************************************************************************/ ***************************************************************************/
#include "eit.h" #include "eit.h"
@ -1250,12 +1250,13 @@ void cSIProcessor::Action()
if (seclen == r) if (seclen == r)
{ {
//dsyslog("Received pid 0x%04X with table ID 0x%02X and length of %4d\n", pid, buf[0], seclen); //dsyslog("Received pid 0x%04X with table ID 0x%02X and length of %4d\n", pid, buf[0], seclen);
cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex
LOCK_THREAD;
switch (pid) switch (pid)
{ {
case 0x00: case 0x00:
if (buf[0] == 0x00) if (buf[0] == 0x00)
{ {
LOCK_THREAD;
if (pmtPid && time(NULL) - lastPmtScan > PMT_SCAN_TIMEOUT) { if (pmtPid && time(NULL) - lastPmtScan > PMT_SCAN_TIMEOUT) {
DelFilter(pmtPid, 0x02); DelFilter(pmtPid, 0x02);
pmtPid = 0; pmtPid = 0;
@ -1263,7 +1264,6 @@ void cSIProcessor::Action()
lastPmtScan = time(NULL); lastPmtScan = time(NULL);
} }
if (!pmtPid) { if (!pmtPid) {
cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex
struct LIST *pat = siParsePAT(buf); struct LIST *pat = siParsePAT(buf);
if (pat) { if (pat) {
int Index = 0; int Index = 0;
@ -1301,7 +1301,6 @@ void cSIProcessor::Action()
case 0x12: case 0x12:
if (buf[0] != 0x72) if (buf[0] != 0x72)
{ {
cMutexLock MutexLock(&schedulesMutex);
cEIT ceit(buf, seclen, schedules); cEIT ceit(buf, seclen, schedules);
ceit.ProcessEIT(buf, currentSource); ceit.ProcessEIT(buf, currentSource);
} }
@ -1310,9 +1309,7 @@ void cSIProcessor::Action()
break; break;
default: { default: {
LOCK_THREAD;
if (pid == pmtPid && buf[0] == 0x02 && currentSource && currentTransponder) { if (pid == pmtPid && buf[0] == 0x02 && currentSource && currentTransponder) {
cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex
struct Pid *pi = siParsePMT(buf); struct Pid *pi = siParsePMT(buf);
if (pi) { if (pi) {
for (struct LIST *d = (struct LIST *)pi->Descriptors; d; d = (struct LIST *)xSucc(d)) { for (struct LIST *d = (struct LIST *)pi->Descriptors; d; d = (struct LIST *)xSucc(d)) {