diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2017-05-30 11:06:55 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2017-05-30 11:06:55 +0200 |
commit | f97a59597f53e2a207b624ab32f491131253987c (patch) | |
tree | 1447dc381514dd21c2143ce0fdeda40f1775c479 | |
parent | 6edfcda43a365cfd94ed6649d66a0adcbb965480 (diff) | |
download | vdr-f97a59597f53e2a207b624ab32f491131253987c.tar.gz vdr-f97a59597f53e2a207b624ab32f491131253987c.tar.bz2 |
Now using a separate mutex to fix the race between SVDRP CHAN and cDevice::HasProgramme()
-rw-r--r-- | CONTRIBUTORS | 2 | ||||
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | device.c | 6 | ||||
-rw-r--r-- | 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 <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() @@ -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). @@ -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; } @@ -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; |