diff --git a/lib/stream.cpp b/lib/stream.cpp index 74ccbeff..8fa8004a 100644 --- a/lib/stream.cpp +++ b/lib/stream.cpp @@ -919,7 +919,12 @@ bool Util::checkException(const JSON::Value &ex, const std::string &useragent){ } Util::DTSCShmReader::DTSCShmReader(const std::string &pageName){ - rPage.init(pageName, 0, false, false); + size_t attempts = 0; + do { + rPage.init(pageName, 0, false, false); + ++attempts; + if (!rPage && attempts < 5){Util::sleep(10);} + } while (!rPage && attempts < 5); if (rPage){rAcc = Util::RelAccX(rPage.mapped);} } diff --git a/src/controller/controller_storage.cpp b/src/controller/controller_storage.cpp index d4e5776c..e7623015 100644 --- a/src/controller/controller_storage.cpp +++ b/src/controller/controller_storage.cpp @@ -21,6 +21,8 @@ namespace Controller{ JSON::Value Storage; ///< Global storage of data. tthread::mutex configMutex; tthread::mutex logMutex; + std::set shmList; + tthread::mutex shmListMutex; uint64_t logCounter = 0; uint64_t lastConfigChange = 0; uint64_t lastConfigWrite = 0; @@ -217,6 +219,7 @@ namespace Controller{ if (shmAccs){shmAccs->master = true;} if (rlxStrm){rlxStrm->setExit();} if (shmStrm){shmStrm->master = true;} + wipeShmPages(); }else{ if (shmLogs){shmLogs->master = false;} if (shmAccs){shmAccs->master = false;} @@ -442,6 +445,7 @@ namespace Controller{ mistCapaOut.close(); } mistCapaOut.init(SHM_CAPA, temp.size() + 100, true, false); + addShmPage(SHM_CAPA); if (!mistCapaOut.mapped){ FAIL_MSG("Could not open capabilities config for writing! Is shared memory enabled on your " "system?"); @@ -454,6 +458,7 @@ namespace Controller{ A.setRCount(1); A.setEndPos(1); A.setReady(); + mistCapaOut.master = false; } void writeProtocols(){ @@ -473,6 +478,7 @@ namespace Controller{ if (proxy_written != tmpProxy){ proxy_written = tmpProxy; static IPC::sharedPage mistProxOut(SHM_PROXY, proxy_written.size() + 100, true, false); + addShmPage(SHM_PROXY); mistProxOut.close(); mistProxOut.init(SHM_PROXY, proxy_written.size() + 100, false, false); if (mistProxOut){ @@ -511,6 +517,7 @@ namespace Controller{ mistProtoOut.close(); } mistProtoOut.init(SHM_PROTO, temp.size() + 100, true, false); + addShmPage(SHM_PROTO); if (!mistProtoOut.mapped){ FAIL_MSG( "Could not open protocol config for writing! Is shared memory enabled on your system?"); @@ -526,6 +533,7 @@ namespace Controller{ A.setEndPos(1); A.setReady(); } + mistProtoOut.master = false; } void writeStream(const std::string &sName, const JSON::Value &sConf){ @@ -640,6 +648,7 @@ namespace Controller{ globAccX.setString("udpApi", udpApiBindAddr); globAccX.setInt("systemBoot", systemBoot); globCfg.master = false; // leave the page after closing + addShmPage(SHM_GLOBAL_CONF); } } @@ -752,4 +761,23 @@ namespace Controller{ } /*LTS-END*/ } + + + void addShmPage(const std::string & page){ + tthread::lock_guard guard(shmListMutex); + shmList.insert(page); + } + + void wipeShmPages(){ + tthread::lock_guard guard(shmListMutex); + if (!shmList.size()){return;} + std::set::iterator it; + for (it = shmList.begin(); it != shmList.end(); ++it){ + IPC::sharedPage page(*it, 0, false, false); + if (page){page.master = true;} + } + shmList.clear(); + } + + }// namespace Controller diff --git a/src/controller/controller_storage.h b/src/controller/controller_storage.h index a03eaaa6..b00711eb 100644 --- a/src/controller/controller_storage.h +++ b/src/controller/controller_storage.h @@ -50,4 +50,7 @@ namespace Controller{ void writeCapabilities(); void writeProtocols(); + void addShmPage(const std::string & page); + void wipeShmPages(); + }// namespace Controller diff --git a/src/input/input.cpp b/src/input/input.cpp index 14c8a2d6..324b02af 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -423,7 +423,8 @@ namespace Mist{ //Set stream status to STRMSTAT_INIT, then close the page in non-master mode to keep it around char pageName[NAME_BUFFER_SIZE]; snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_STATE, streamName.c_str()); - streamStatus.init(pageName, 2, true, false); + streamStatus.init(pageName, 2, false, false); + if (!streamStatus){streamStatus.init(pageName, 2, true, false);} if (streamStatus){streamStatus.mapped[0] = STRMSTAT_INIT;} streamStatus.master = false; streamStatus.close(); @@ -470,7 +471,8 @@ namespace Mist{ // Re-init streamStatus, previously closed char pageName[NAME_BUFFER_SIZE]; snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_STATE, streamName.c_str()); - streamStatus.init(pageName, 2, true, false); + streamStatus.init(pageName, 2, false, false); + if (!streamStatus){streamStatus.init(pageName, 2, true, false);} streamStatus.master = false; if (streamStatus){streamStatus.mapped[0] = STRMSTAT_INIT;} } @@ -480,8 +482,11 @@ namespace Mist{ playerLock.unlink(); char pageName[NAME_BUFFER_SIZE]; snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_STATE, streamName.c_str()); - streamStatus.init(pageName, 2, true, false); - streamStatus.close(); + streamStatus.init(pageName, 2, false, false); + if (streamStatus){ + streamStatus.master = true; + streamStatus.close(); + } } playerLock.unlink(); pullLock.unlink(); @@ -501,7 +506,8 @@ namespace Mist{ // Re-init streamStatus, previously closed char pageName[NAME_BUFFER_SIZE]; snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_STATE, streamName.c_str()); - streamStatus.init(pageName, 2, true, false); + streamStatus.init(pageName, 2, false, false); + if (!streamStatus){streamStatus.init(pageName, 2, true, false);} streamStatus.master = false; if (streamStatus){streamStatus.mapped[0] = STRMSTAT_INIT;} } @@ -539,7 +545,7 @@ namespace Mist{ if (playerLock){ char pageName[NAME_BUFFER_SIZE]; snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_STATE, streamName.c_str()); - streamStatus.init(pageName, 2, true, false); + streamStatus.init(pageName, 2, false, false); if (streamStatus){streamStatus.mapped[0] = STRMSTAT_INVALID;} } #if DEBUG >= DLVL_DEVEL @@ -566,12 +572,17 @@ namespace Mist{ char pageName[NAME_BUFFER_SIZE]; snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_IPID, streamName.c_str()); pidPage.init(pageName, 8, false, false); - pidPage.master = true; - pidPage.close(); + if (pidPage){ + pidPage.master = true; + pidPage.close(); + } //Clear stream state snprintf(pageName, NAME_BUFFER_SIZE, SHM_STREAM_STATE, streamName.c_str()); - streamStatus.init(pageName, 2, true, false); - streamStatus.close(); + streamStatus.init(pageName, 2, false, false); + if (streamStatus){ + streamStatus.master = true; + streamStatus.close(); + } //Delete lock playerLock.unlink(); }