From a2b6b142d8cfbae4373449b3ad582cdc6c1f5cc0 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 18 Mar 2018 12:03:46 +0100 Subject: [PATCH] Modified cMenuTimers::Delete() to avoid a lengthy lock on the Timers list while prompting the user --- HISTORY | 2 ++ menu.c | 38 ++++++++++++++++++-------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/HISTORY b/HISTORY index ad48f22a..2611da68 100644 --- a/HISTORY +++ b/HISTORY @@ -9314,3 +9314,5 @@ Video Disk Recorder Revision History - Fixed handling parameters in the S2SatelliteDeliverySystemDescriptor and T2DeliverySystemDescriptor that were overwritten when parsing the SatelliteDeliverySystemDescriptor or TerrestrialDeliverySystemDescriptor, respectively. +- Modified cMenuTimers::Delete() to avoid a lengthy lock on the Timers list while prompting + the user. diff --git a/menu.c b/menu.c index e6c79d91..d5300153 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.68 2018/03/09 15:02:29 kls Exp $ + * $Id: menu.c 4.69 2018/03/18 12:01:09 kls Exp $ */ #include "menu.h" @@ -1344,29 +1344,27 @@ eOSState cMenuTimers::Delete(void) // Check if this timer is active: cTimer *Timer = GetTimer(); if (Timer) { - if (Interface->Confirm(tr("Delete timer?"))) { - if (Timer->Recording()) { - if (Interface->Confirm(tr("Timer still recording - really delete?"))) { - if (!Timer->Remote()) { - Timer->Skip(); - cRecordControls::Process(Timers, time(NULL)); - } - } - else - Timer = NULL; - } + bool TimerRecording = Timer->Recording(); + timersStateKey.Remove(false); // must release lock while prompting! + if (Interface->Confirm(tr("Delete timer?")) && (!TimerRecording || Interface->Confirm(tr("Timer still recording - really delete?")))) { + Timers = cTimers::GetTimersWrite(timersStateKey); + Timer = GetTimer(); if (Timer) { - if (!HandleRemoteModifications(NULL, Timer)) { - timersStateKey.Remove(); - return osContinue; + if (!Timer->Remote()) { + Timer->Skip(); + cRecordControls::Process(Timers, time(NULL)); + } + if (HandleRemoteModifications(NULL, Timer)) { + if (Timer->Remote()) + Timers->SetSyncStateKey(StateKeySVDRPRemoteTimersPoll); + Timers->Del(Timer); + cOsdMenu::Del(Current()); + Display(); } - if (Timer->Remote()) - Timers->SetSyncStateKey(StateKeySVDRPRemoteTimersPoll); - Timers->Del(Timer); - cOsdMenu::Del(Current()); - Display(); } } + else + return osContinue; } timersStateKey.Remove(Timer != NULL); return osContinue;