summaryrefslogtreecommitdiff
path: root/menu.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2018-05-06 09:41:03 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2018-05-06 09:41:03 +0200
commitd380b57d2849d0df66c14995130dcbbfadbc9d1f (patch)
treecee52522c25d5b034e75aea7e2116559c614eb12 /menu.c
parent820a0ddb8a046c04833c667ecaf0148babe837bc (diff)
downloadvdr-d380b57d2849d0df66c14995130dcbbfadbc9d1f.tar.gz
vdr-d380b57d2849d0df66c14995130dcbbfadbc9d1f.tar.bz2
Fixed locking the Channels list in cDisplayChannel, where the lock was still held when Flush() was called
Diffstat (limited to 'menu.c')
-rw-r--r--menu.c71
1 files changed, 38 insertions, 33 deletions
diff --git a/menu.c b/menu.c
index 686806a0..a9ea49d2 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 4.75 2018/04/28 12:09:45 kls Exp $
+ * $Id: menu.c 4.76 2018/05/06 09:30:11 kls Exp $
*/
#include "menu.h"
@@ -4626,14 +4626,17 @@ cDisplayChannel::cDisplayChannel(int Number, bool Switched)
cOsdProvider::OsdSizeChanged(osdState); // just to get the current state
positioner = NULL;
channel = NULL;
- LOCK_CHANNELS_READ;
- channel = Channels->GetByNumber(Number);
- lastPresent = lastFollowing = NULL;
- if (channel) {
- DisplayChannel();
- DisplayInfo();
+ {
+ LOCK_CHANNELS_READ;
+ channel = Channels->GetByNumber(Number);
+ lastPresent = lastFollowing = NULL;
+ if (channel) {
+ DisplayChannel();
+ DisplayInfo();
+ }
+ }
+ if (channel)
displayChannel->Flush();
- }
lastTime.Set();
}
@@ -4868,31 +4871,33 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)
}
};
if (positioner || !timeout || lastTime.Elapsed() < (uint64_t)(Setup.ChannelInfoTime * 1000)) {
- LOCK_CHANNELS_READ;
- if (Key == kNone && !number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
- // makes sure a channel switch through the SVDRP CHAN command is displayed
- channel = Channels->GetByNumber(cDevice::CurrentChannel());
- Refresh();
- lastTime.Set();
- }
- DisplayInfo();
- if (NewChannel) {
- SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
- Channels->SwitchTo(NewChannel->Number());
- SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
- channel = NewChannel;
- }
- const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
- bool PositionerMoving = Positioner && Positioner->IsMoving();
- SetNeedsFastResponse(PositionerMoving);
- if (!PositionerMoving) {
- if (positioner)
- lastTime.Set(); // to keep the channel display up a few seconds after the target position has been reached
- Positioner = NULL;
- }
- if (Positioner || positioner) // making sure we call SetPositioner(NULL) if there is a switch from "with" to "without" positioner
- displayChannel->SetPositioner(Positioner);
- positioner = Positioner;
+ {
+ LOCK_CHANNELS_READ;
+ if (Key == kNone && !number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
+ // makes sure a channel switch through the SVDRP CHAN command is displayed
+ channel = Channels->GetByNumber(cDevice::CurrentChannel());
+ Refresh();
+ lastTime.Set();
+ }
+ DisplayInfo();
+ if (NewChannel) {
+ SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
+ Channels->SwitchTo(NewChannel->Number());
+ SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
+ channel = NewChannel;
+ }
+ const cPositioner *Positioner = cDevice::ActualDevice()->Positioner();
+ bool PositionerMoving = Positioner && Positioner->IsMoving();
+ SetNeedsFastResponse(PositionerMoving);
+ if (!PositionerMoving) {
+ if (positioner)
+ lastTime.Set(); // to keep the channel display up a few seconds after the target position has been reached
+ Positioner = NULL;
+ }
+ if (Positioner || positioner) // making sure we call SetPositioner(NULL) if there is a switch from "with" to "without" positioner
+ displayChannel->SetPositioner(Positioner);
+ positioner = Positioner;
+ }
displayChannel->Flush();
return osContinue;
}