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:
parent
8d4d7f2b62
commit
5261fd663f
@ -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
|
||||||
|
4
HISTORY
4
HISTORY
@ -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
9
eit.c
@ -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)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user