diff --git a/HISTORY b/HISTORY index 68c6e922..39733817 100644 --- a/HISTORY +++ b/HISTORY @@ -9663,7 +9663,7 @@ Video Disk Recorder Revision History - EXPIRELATENCY now only applies to VPS timers. - Deleting expired timers is now triggered immediately after the timers are modified. -2021-05-19: +2021-05-20: - Now using a separate fixed value for internal EPG linger time. This fixes problems with spawned timers jumping to the next event in case Setup.EPGLinger is very small. (reported @@ -9683,3 +9683,8 @@ Video Disk Recorder Revision History plugin insists in using "using namespace std;" you can still define DISABLE_TEMPLATES_COLLIDING_WITH_STL before including any VDR header files. - Removed 'register' from libsi/util.c to avoid a warning with ISO-C++17. +- The cFile class has been partially deprecated: + + The handling of file handles was not thread-safe. + + It was only actually used in svdrp.c. + + cFile::Ready() now processes only its own file descriptor by calling FileReady() + instead of AnyFileReady(). diff --git a/tools.c b/tools.c index ed0589cb..8267d290 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 5.3 2021/01/19 20:38:28 kls Exp $ + * $Id: tools.c 5.4 2021/05/20 10:13:43 kls Exp $ */ #include "tools.h" @@ -1633,8 +1633,10 @@ bool cFileNameList::Load(const char *Directory, bool DirsOnly) // --- cFile ----------------------------------------------------------------- +#if DEPRECATED_CFILE bool cFile::files[FD_SETSIZE] = { false }; int cFile::maxFiles = 0; +#endif cFile::cFile(void) { @@ -1659,6 +1661,7 @@ bool cFile::Open(int FileDes) if (FileDes >= 0) { if (!IsOpen()) { f = FileDes; +#if DEPRECATED_CFILE if (f >= 0) { if (f < FD_SETSIZE) { if (f >= maxFiles) @@ -1672,27 +1675,31 @@ bool cFile::Open(int FileDes) else esyslog("ERROR: file descriptor %d is larger than FD_SETSIZE (%d)", f, FD_SETSIZE); } +#endif } else esyslog("ERROR: attempt to re-open file descriptor %d", FileDes); } - return false; + return IsOpen(); } void cFile::Close(void) { if (f >= 0) { close(f); +#if DEPRECATED_CFILE files[f] = false; +#endif f = -1; } } bool cFile::Ready(bool Wait) { - return f >= 0 && AnyFileReady(f, Wait ? 1000 : 0); + return f >= 0 && FileReady(f, Wait ? 1000 : 0); } +#if DEPRECATED_CFILE bool cFile::AnyFileReady(int FileDes, int TimeoutMs) { fd_set set; @@ -1710,6 +1717,7 @@ bool cFile::AnyFileReady(int FileDes, int TimeoutMs) timeout.tv_usec = (TimeoutMs % 1000) * 1000; return select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0 && (FileDes < 0 || FD_ISSET(FileDes, &set)); } +#endif bool cFile::FileReady(int FileDes, int TimeoutMs) { @@ -1726,6 +1734,7 @@ bool cFile::FileReady(int FileDes, int TimeoutMs) return select(FD_SETSIZE, &set, NULL, NULL, (TimeoutMs >= 0) ? &timeout : NULL) > 0 && FD_ISSET(FileDes, &set); } +#if DEPRECATED_CFILE bool cFile::FileReadyForWriting(int FileDes, int TimeoutMs) { fd_set set; @@ -1738,6 +1747,7 @@ bool cFile::FileReadyForWriting(int FileDes, int TimeoutMs) timeout.tv_usec = TimeoutMs * 1000; return select(FD_SETSIZE, NULL, &set, NULL, &timeout) > 0 && FD_ISSET(FileDes, &set); } +#endif // --- cSafeFile ------------------------------------------------------------- diff --git a/tools.h b/tools.h index 4e88a059..922a342b 100644 --- a/tools.h +++ b/tools.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.h 5.4 2021/05/19 11:50:24 kls Exp $ + * $Id: tools.h 5.5 2021/05/20 10:13:43 kls Exp $ */ #ifndef __TOOLS_H @@ -451,10 +451,15 @@ public: struct dirent *Next(void); }; +#ifndef DEPRECATED_CFILE +#define DEPRECATED_CFILE 0 +#endif class cFile { private: +#if DEPRECATED_CFILE static bool files[]; static int maxFiles; +#endif int f; public: cFile(void); @@ -465,9 +470,13 @@ public: void Close(void); bool IsOpen(void) { return f >= 0; } bool Ready(bool Wait = true); +#if DEPRECATED_CFILE static bool AnyFileReady(int FileDes = -1, int TimeoutMs = 1000); +#endif static bool FileReady(int FileDes, int TimeoutMs = 1000); +#if DEPRECATED_CFILE static bool FileReadyForWriting(int FileDes, int TimeoutMs = 1000); +#endif }; class cSafeFile {