From 2bf7c14815c7564b2560fca6783ea82c24f13692 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 18 Jul 2020 23:51:11 +0200 Subject: [PATCH] Fixed SEM_TRACKLIST not being cleaned up from shared memory on stream shutdown --- lib/dtsc.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index 6c94969c..3d9a4632 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -1522,6 +1522,11 @@ namespace DTSC{ return -1; } trackLock.wait(); + if (stream.isExit()){ + trackLock.post(); + FAIL_MSG("Not adding track: stream is shutting down"); + return -1; + } size_t pageSize = TRACK_TRACK_OFFSET + TRACK_TRACK_RECORDSIZE + (TRACK_FRAGMENT_OFFSET + (TRACK_FRAGMENT_RECORDSIZE * fragCount)) + (TRACK_KEY_OFFSET + (TRACK_KEY_RECORDSIZE * keyCount)) + @@ -2334,6 +2339,10 @@ namespace DTSC{ sizeMemBuf.clear(); } if (isMaster){ + char pageName[NAME_BUFFER_SIZE]; + snprintf(pageName, NAME_BUFFER_SIZE, SEM_TRACKLIST, streamName.c_str()); + IPC::semaphore trackLock(pageName, O_CREAT|O_RDWR, ACCESSPERMS, 1); + trackLock.tryWaitOneSecond(); std::set toRemove; for (std::map::iterator it = tM.begin(); it != tM.end(); it++){ if (!it->second.mapped){continue;} @@ -2344,6 +2353,8 @@ namespace DTSC{ } if (streamPage.mapped && stream.isReady()){stream.setExit();} streamPage.master = true; + //Wipe tracklist semaphore. This is not done anywhere else in the codebase. + trackLock.unlink(); } stream = Util::RelAccX(); trackList = Util::RelAccX();