Fixed a deadlock in the SVDRP command PLAY in case there is currently a recording being replayed

This commit is contained in:
Klaus Schmidinger 2017-04-04 11:05:38 +02:00
parent 7170c20c7e
commit 63a32ce483
2 changed files with 33 additions and 22 deletions

View File

@ -8961,3 +8961,5 @@ Video Disk Recorder Revision History
Thanks to Sergey Chernyavskiy. Thanks to Sergey Chernyavskiy.
- Changed 'number' to 'id' in the help texts of SVDRP commands that deal with - Changed 'number' to 'id' in the help texts of SVDRP commands that deal with
timers. timers.
- Fixed a deadlock in the SVDRP command PLAY in case there is currently a
recording being replayed.

53
svdrp.c
View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 4.14 2017/04/04 09:39:36 kls Exp $ * $Id: svdrp.c 4.15 2017/04/04 11:01:10 kls Exp $
*/ */
#include "svdrp.h" #include "svdrp.h"
@ -2057,29 +2057,38 @@ void cSVDRPServer::CmdPLAY(const char *Option)
char c = *option; char c = *option;
*option = 0; *option = 0;
if (isnumber(num)) { if (isnumber(num)) {
LOCK_RECORDINGS_READ; cStateKey StateKey;
if (const cRecording *Recording = Recordings->GetById(strtol(num, NULL, 10))) { if (const cRecordings *Recordings = cRecordings::GetRecordingsRead(StateKey)) {
if (c) if (const cRecording *Recording = Recordings->GetById(strtol(num, NULL, 10))) {
option = skipspace(++option); cString FileName = Recording->FileName();
cReplayControl::SetRecording(NULL); cString Title = Recording->Title();
cControl::Shutdown(); int FramesPerSecond = Recording->FramesPerSecond();
if (*option) { bool IsPesRecording = Recording->IsPesRecording();
int pos = 0; StateKey.Remove(); // must give up the lock for the call to cControl::Shutdown()
if (strcasecmp(option, "BEGIN") != 0) if (c)
pos = HMSFToIndex(option, Recording->FramesPerSecond()); option = skipspace(++option);
cResumeFile Resume(Recording->FileName(), Recording->IsPesRecording()); cReplayControl::SetRecording(NULL);
if (pos <= 0) cControl::Shutdown();
Resume.Delete(); if (*option) {
else int pos = 0;
Resume.Save(pos); if (strcasecmp(option, "BEGIN") != 0)
pos = HMSFToIndex(option, FramesPerSecond);
cResumeFile Resume(FileName, IsPesRecording);
if (pos <= 0)
Resume.Delete();
else
Resume.Save(pos);
}
cReplayControl::SetRecording(FileName);
cControl::Launch(new cReplayControl);
cControl::Attach();
Reply(250, "Playing recording \"%s\" [%s]", num, *Title);
}
else {
StateKey.Remove();
Reply(550, "Recording \"%s\" not found", num);
} }
cReplayControl::SetRecording(Recording->FileName());
cControl::Launch(new cReplayControl);
cControl::Attach();
Reply(250, "Playing recording \"%s\" [%s]", num, Recording->Title());
} }
else
Reply(550, "Recording \"%s\" not found", num);
} }
else else
Reply(501, "Error in recording number \"%s\"", num); Reply(501, "Error in recording number \"%s\"", num);