summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS2
-rw-r--r--HISTORY3
-rw-r--r--device.c6
-rw-r--r--device.h3
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 <user.vdr@gmail.com>
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 <frostworks@gmx.de>
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;