From f97a59597f53e2a207b624ab32f491131253987c Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Tue, 30 May 2017 11:06:55 +0200 Subject: [PATCH] Now using a separate mutex to fix the race between SVDRP CHAN and cDevice::HasProgramme() --- CONTRIBUTORS | 2 ++ HISTORY | 3 +++ device.c | 6 +++--- device.h | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 7cdb554c..a3d593f3 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2858,6 +2858,8 @@ Derek Kelly for suggesting to change the naming of "binary skip mode" to "adaptive skip mode" for suggesting to make the -u option also accept a numerical user id for reporting a problem with abs() in gcc6+ when called with an unsigned variable + for reporting a deadlock after the fix for a race between SVDRP CHAN and + cDevice::HasProgramme() Marcel Unbehaun for adding cRecordingInfo::GetEvent() diff --git a/HISTORY b/HISTORY index 8ea3ebfc..55c8909b 100644 --- a/HISTORY +++ b/HISTORY @@ -9084,3 +9084,6 @@ Video Disk Recorder Revision History - Fixed generating k_Release key events for LIRC remote controls (due to the short timeout another normal key was sometimes put into the queue after the generated release). Also removed some code redundancy and added some buffer checks. +- Now using a separate mutex to fix the race between SVDRP CHAN and + cDevice::HasProgramme(), because the previous fix caused a deadlock (reported by + Derek Kelly). diff --git a/device.c b/device.c index 7c1c74b1..3c676922 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 4.22 2017/05/18 09:27:55 kls Exp $ + * $Id: device.c 4.23 2017/05/30 11:06:11 kls Exp $ */ #include "device.h" @@ -834,7 +834,7 @@ bool cDevice::SwitchChannel(int Direction) eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) { - cMutexLock MutexLock(&mutexReceiver); // to avoid a race between SVDRP CHAN and HasProgramme() + cMutexLock MutexLock(&mutexChannel); // to avoid a race between SVDRP CHAN and HasProgramme() cStatus::MsgChannelSwitch(this, 0, LiveView); if (LiveView) { @@ -947,7 +947,7 @@ bool cDevice::HasLock(int TimeoutMs) const bool cDevice::HasProgramme(void) const { - cMutexLock MutexLock(&mutexReceiver); // to avoid a race between SVDRP CHAN and HasProgramme() + cMutexLock MutexLock(&mutexChannel); // to avoid a race between SVDRP CHAN and HasProgramme() return Replaying() || pidHandles[ptAudio].pid || pidHandles[ptVideo].pid; } diff --git a/device.h b/device.h index f6aee4e9..83e51782 100644 --- a/device.h +++ b/device.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 4.9 2017/05/09 11:24:47 kls Exp $ + * $Id: device.h 4.10 2017/05/30 11:06:11 kls Exp $ */ #ifndef __DEVICE_H @@ -257,6 +257,7 @@ public: // Channel facilities private: + mutable cMutex mutexChannel; time_t occupiedTimeout; protected: static int currentChannel;