diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2018-05-06 09:41:03 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2018-05-06 09:41:03 +0200 |
commit | d380b57d2849d0df66c14995130dcbbfadbc9d1f (patch) | |
tree | cee52522c25d5b034e75aea7e2116559c614eb12 /menu.c | |
parent | 820a0ddb8a046c04833c667ecaf0148babe837bc (diff) | |
download | vdr-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.c | 71 |
1 files changed, 38 insertions, 33 deletions
@@ -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; } |