mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Fixed a deadlock when moving a folder containing several recordings between different volumes
This commit is contained in:
parent
b5d8f68b87
commit
b96277e28a
@ -3284,6 +3284,8 @@ Matthias Senzel <matthias.senzel@t-online.de>
|
||||
for reporting a bug in drawing very long menu titles in the LCARS skin
|
||||
for reporting and helping to debug a crash when stopping VDR
|
||||
for reporting a crash when moving a recording between different volumes
|
||||
for reporting a deadlock when moving a folder containing several recordings between
|
||||
different volumes
|
||||
|
||||
Marek Nazarko <mnazarko@gmail.com>
|
||||
for translating OSD texts to the Polish language
|
||||
|
4
HISTORY
4
HISTORY
@ -9162,7 +9162,7 @@ Video Disk Recorder Revision History
|
||||
a subdirectory.
|
||||
- SVDRP peering can now be limited to the default SVDRP host (see MANUAL for details).
|
||||
|
||||
2017-11-29: Version 2.3.9
|
||||
2017-12-04: Version 2.3.9
|
||||
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||
@ -9213,3 +9213,5 @@ Video Disk Recorder Revision History
|
||||
- Fixed positioning the cursor in the Recordings menu when moving a recording between
|
||||
different volumes.
|
||||
- Added a note to PLUGINS.html about writing log messages in English.
|
||||
- Fixed a deadlock when moving a folder containing several recordings between
|
||||
different volumes (reported by Matthias Senzel).
|
||||
|
16
recording.c
16
recording.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.c 4.11 2017/11/27 13:58:34 kls Exp $
|
||||
* $Id: recording.c 4.12 2017/12/04 13:03:11 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -1857,7 +1857,7 @@ public:
|
||||
int Usage(const char *FileName = NULL) const;
|
||||
const char *FileNameSrc(void) const { return fileNameSrc; }
|
||||
const char *FileNameDst(void) const { return fileNameDst; }
|
||||
bool Active(bool &Error);
|
||||
bool Active(cRecordings *Recordings, bool &Error);
|
||||
};
|
||||
|
||||
cRecordingsHandlerEntry::cRecordingsHandlerEntry(int Usage, const char *FileNameSrc, const char *FileNameDst)
|
||||
@ -1887,7 +1887,7 @@ int cRecordingsHandlerEntry::Usage(const char *FileName) const
|
||||
return u;
|
||||
}
|
||||
|
||||
bool cRecordingsHandlerEntry::Active(bool &Error)
|
||||
bool cRecordingsHandlerEntry::Active(cRecordings *Recordings, bool &Error)
|
||||
{
|
||||
bool CopierFinishedOk = false;
|
||||
// First test whether there is an ongoing operation:
|
||||
@ -1917,18 +1917,18 @@ bool cRecordingsHandlerEntry::Active(bool &Error)
|
||||
copier->Start();
|
||||
}
|
||||
ClearPending();
|
||||
LOCK_RECORDINGS_WRITE; // to trigger a state change
|
||||
Recordings->SetModified(); // to trigger a state change
|
||||
return true;
|
||||
}
|
||||
// Clean up:
|
||||
if (CopierFinishedOk && (Usage() & ruMove) != 0) {
|
||||
cRecording Recording(FileNameSrc());
|
||||
if (Recording.Delete()) {
|
||||
LOCK_RECORDINGS_WRITE;
|
||||
Recordings->DelByName(Recording.FileName());
|
||||
Recordings->SetModified(); // to trigger a state change
|
||||
}
|
||||
}
|
||||
LOCK_RECORDINGS_WRITE; // to trigger a state change
|
||||
Recordings->SetModified(); // to trigger a state change
|
||||
Recordings->TouchUpdate();
|
||||
return false;
|
||||
}
|
||||
@ -1954,9 +1954,11 @@ void cRecordingsHandler::Action(void)
|
||||
while (Running()) {
|
||||
bool Sleep = false;
|
||||
{
|
||||
LOCK_RECORDINGS_WRITE;
|
||||
Recordings->SetExplicitModify();
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (cRecordingsHandlerEntry *r = operations.First()) {
|
||||
if (!r->Active(error))
|
||||
if (!r->Active(Recordings, error))
|
||||
operations.Del(r);
|
||||
else
|
||||
Sleep = true;
|
||||
|
Loading…
Reference in New Issue
Block a user