From e4e9d7a55f8317598a884279d0177b97d404a305 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Mon, 2 Dec 2024 12:40:56 +0100 Subject: [PATCH] Added some missing locking --- HISTORY | 3 ++- menu.c | 20 +++++++++++++------- skinlcars.c | 3 ++- vdr.c | 3 ++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/HISTORY b/HISTORY index 79194869..6fc0efdd 100644 --- a/HISTORY +++ b/HISTORY @@ -10034,7 +10034,7 @@ Video Disk Recorder Revision History (suggested by Stefan Hofmann). - Added vdrrootdir and incdir to vdr.pc (thanks to Stefan Hofmann). -2024-11-30: +2024-12-02: - Removed all DEPRECATED_* code. - Fixed error checking in case the fps value can't be determined by the frame parser. @@ -10042,3 +10042,4 @@ Video Disk Recorder Revision History - The VDR homepage is now accessible via HTTPS. - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Fixed some typos in the translation files (thanks to Stefan Hofmann). +- Added some missing locking. diff --git a/menu.c b/menu.c index 413bfd36..ecf9500e 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 5.18 2024/10/11 14:10:50 kls Exp $ + * $Id: menu.c 5.19 2024/12/02 12:40:56 kls Exp $ */ #include "menu.h" @@ -1263,6 +1263,7 @@ void cMenuTimerItem::Set(void) } const char *File = timer->Pattern(); if (!*File) { + LOCK_SCHEDULES_READ; if (timer->HasFlags(tfSpawned) && timer->Event() && timer->Event()->Title()) File = timer->Event()->Title(); else { @@ -1334,12 +1335,15 @@ void cMenuTimers::Set(void) const cTimer *CurrentTimer = GetTimer(); cMenuTimerItem *CurrentItem = NULL; Clear(); - for (const cTimer *Timer = Timers->First(); Timer; Timer = Timers->Next(Timer)) { - cMenuTimerItem *Item = new cMenuTimerItem(Timer); - Add(Item); - if (CurrentTimer && Timer->Id() == CurrentTimer->Id() && (!Timer->Remote() && !CurrentTimer->Remote() || Timer->Remote() && CurrentTimer->Remote() && strcmp(Timer->Remote(), CurrentTimer->Remote()) == 0)) - CurrentItem = Item; - } + { + LOCK_SCHEDULES_READ; + for (const cTimer *Timer = Timers->First(); Timer; Timer = Timers->Next(Timer)) { + cMenuTimerItem *Item = new cMenuTimerItem(Timer); + Add(Item); + if (CurrentTimer && Timer->Id() == CurrentTimer->Id() && (!Timer->Remote() && !CurrentTimer->Remote() || Timer->Remote() && CurrentTimer->Remote() && strcmp(Timer->Remote(), CurrentTimer->Remote()) == 0)) + CurrentItem = Item; + } + } Sort(); SetCurrent(CurrentItem ? CurrentItem : First()); SetHelpKeys(); @@ -1454,6 +1458,7 @@ eOSState cMenuTimers::Info(void) return osContinue; LOCK_TIMERS_READ; LOCK_CHANNELS_READ; + LOCK_SCHEDULES_READ; cTimer *Timer = GetTimer(); if (Timer && Timer->Event()) return AddSubMenu(new cMenuEvent(Timers, Channels, Timer->Event())); @@ -1599,6 +1604,7 @@ static const char *TimerMatchChars = " tT iI"; bool cMenuScheduleItem::Update(const cTimers *Timers, bool Force) { + LOCK_SCHEDULES_READ; eTimerMatch OldTimerMatch = timerMatch; bool OldTimerActive = timerActive; const cTimer *Timer = Timers->GetMatch(event, &timerMatch); diff --git a/skinlcars.c b/skinlcars.c index 128a99db..cc06ba0a 100644 --- a/skinlcars.c +++ b/skinlcars.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: skinlcars.c 5.7 2024/09/21 10:53:07 kls Exp $ + * $Id: skinlcars.c 5.8 2024/12/02 12:40:56 kls Exp $ */ // "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures, @@ -1259,6 +1259,7 @@ void cSkinLCARSDisplayMenu::DrawTimers(void) int NumDevices = 0; int y = ys04; // Timers and recording devices: + LOCK_SCHEDULES_READ; while (1) { int NumTimers = 0; const cDevice *Device = NULL; diff --git a/vdr.c b/vdr.c index 116b7072..7c24c7b3 100644 --- a/vdr.c +++ b/vdr.c @@ -22,7 +22,7 @@ * * The project's page is at https://www.tvdr.de * - * $Id: vdr.c 5.17 2024/10/21 19:03:09 kls Exp $ + * $Id: vdr.c 5.18 2024/12/02 12:40:56 kls Exp $ */ #include @@ -1140,6 +1140,7 @@ int main(int argc, char *argv[]) if (Timer->Matches(Now, true, Setup.VpsMargin)) InVpsMargin = true; else if (Timer->Event()) { + LOCK_SCHEDULES_READ; InVpsMargin = Timer->Event()->StartTime() <= Now && Now < Timer->Event()->EndTime(); NeedsTransponder = Timer->Event()->StartTime() - Now < VPSLOOKAHEADTIME * 3600 && !Timer->Event()->SeenWithin(VPSUPTODATETIME); }