summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY2
-rw-r--r--menu.c38
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;