From ca755039e10b315ca7a18292f954ba64ce4c9067 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Wed, 5 Dec 2018 00:19:35 +0100 Subject: [PATCH] Only re-write trigger pages if trigger configuration has changed --- src/controller/controller_storage.cpp | 130 +++++++++++++------------- 1 file changed, 67 insertions(+), 63 deletions(-) diff --git a/src/controller/controller_storage.cpp b/src/controller/controller_storage.cpp index 5ee0905f..8cc7b3d5 100644 --- a/src/controller/controller_storage.cpp +++ b/src/controller/controller_storage.cpp @@ -333,83 +333,87 @@ namespace Controller{ /*LTS-START*/ static std::map pageForType; // should contain one page for every trigger type + static JSON::Value writtenTrigs; char tmpBuf[NAME_BUFFER_SIZE]; - // for all shm pages that hold triggers - pageForType.clear(); + if (writtenTrigs != Storage["config"]["triggers"]){ + writtenTrigs = Storage["config"]["triggers"]; + // for all shm pages that hold triggers + pageForType.clear(); - if (Storage["config"]["triggers"].size()){ - jsonForEach(Storage["config"]["triggers"], it){ - snprintf(tmpBuf, NAME_BUFFER_SIZE, SHM_TRIGGER, (it.key()).c_str()); - pageForType[it.key()].init(tmpBuf, 32 * 1024, true, false); - Util::RelAccX tPage(pageForType[it.key()].mapped, false); - tPage.addField("url", RAX_128STRING); - tPage.addField("sync", RAX_UINT); - tPage.addField("streams", RAX_256RAW); - tPage.addField("params", RAX_128STRING); - tPage.addField("default", RAX_128STRING); - tPage.setReady(); - uint32_t i = 0; - uint32_t max = (32 * 1024 - tPage.getOffset()) / tPage.getRSize(); + if (Storage["config"]["triggers"].size()){ + jsonForEach(Storage["config"]["triggers"], it){ + snprintf(tmpBuf, NAME_BUFFER_SIZE, SHM_TRIGGER, (it.key()).c_str()); + pageForType[it.key()].init(tmpBuf, 32 * 1024, true, false); + Util::RelAccX tPage(pageForType[it.key()].mapped, false); + tPage.addField("url", RAX_128STRING); + tPage.addField("sync", RAX_UINT); + tPage.addField("streams", RAX_256RAW); + tPage.addField("params", RAX_128STRING); + tPage.addField("default", RAX_128STRING); + tPage.setReady(); + uint32_t i = 0; + uint32_t max = (32 * 1024 - tPage.getOffset()) / tPage.getRSize(); - // write data to page - jsonForEach(*it, triggIt){ - if (i >= max){ - ERROR_MSG("Not all %s triggers fit on the memory page!", (it.key()).c_str()); - break; - } + // write data to page + jsonForEach(*it, triggIt){ + if (i >= max){ + ERROR_MSG("Not all %s triggers fit on the memory page!", (it.key()).c_str()); + break; + } - if (triggIt->isArray()){ - tPage.setString("url", (*triggIt)[0u].asStringRef(), i); - tPage.setInt("sync", ((*triggIt)[1u].asBool() ? 1 : 0), i); - char *strmP = tPage.getPointer("streams", i); - if (strmP){ - ((unsigned int *)strmP)[0] = 0; // reset first 4 bytes of stream list pointer - if ((triggIt->size() >= 3) && (*triggIt)[2u].size()){ - std::string namesArray; - jsonForEach((*triggIt)[2u], shIt){ - ((unsigned int *)tmpBuf)[0] = shIt->asString().size(); - namesArray.append(tmpBuf, 4); - namesArray.append(shIt->asString()); + if (triggIt->isArray()){ + tPage.setString("url", (*triggIt)[0u].asStringRef(), i); + tPage.setInt("sync", ((*triggIt)[1u].asBool() ? 1 : 0), i); + char *strmP = tPage.getPointer("streams", i); + if (strmP){ + ((unsigned int *)strmP)[0] = 0; // reset first 4 bytes of stream list pointer + if ((triggIt->size() >= 3) && (*triggIt)[2u].size()){ + std::string namesArray; + jsonForEach((*triggIt)[2u], shIt){ + ((unsigned int *)tmpBuf)[0] = shIt->asString().size(); + namesArray.append(tmpBuf, 4); + namesArray.append(shIt->asString()); + } + if (namesArray.size()){memcpy(strmP, namesArray.data(), std::min(namesArray.size(), (size_t)256));} } - if (namesArray.size()){memcpy(strmP, namesArray.data(), std::min(namesArray.size(), (size_t)256));} } } - } - if (triggIt->isObject()){ - if (!triggIt->isMember("handler") || (*triggIt)["handler"].isNull()){continue;} - tPage.setString("url", (*triggIt)["handler"].asStringRef(), i); - tPage.setInt("sync", ((*triggIt)["sync"].asBool() ? 1 : 0), i); - char *strmP = tPage.getPointer("streams", i); - if (strmP){ - ((unsigned int *)strmP)[0] = 0; // reset first 4 bytes of stream list pointer - if ((triggIt->isMember("streams")) && (*triggIt)["streams"].size()){ - std::string namesArray; - jsonForEach((*triggIt)["streams"], shIt){ - ((unsigned int *)tmpBuf)[0] = shIt->asString().size(); - namesArray.append(tmpBuf, 4); - namesArray.append(shIt->asString()); + if (triggIt->isObject()){ + if (!triggIt->isMember("handler") || (*triggIt)["handler"].isNull()){continue;} + tPage.setString("url", (*triggIt)["handler"].asStringRef(), i); + tPage.setInt("sync", ((*triggIt)["sync"].asBool() ? 1 : 0), i); + char *strmP = tPage.getPointer("streams", i); + if (strmP){ + ((unsigned int *)strmP)[0] = 0; // reset first 4 bytes of stream list pointer + if ((triggIt->isMember("streams")) && (*triggIt)["streams"].size()){ + std::string namesArray; + jsonForEach((*triggIt)["streams"], shIt){ + ((unsigned int *)tmpBuf)[0] = shIt->asString().size(); + namesArray.append(tmpBuf, 4); + namesArray.append(shIt->asString()); + } + if (namesArray.size()){memcpy(strmP, namesArray.data(), std::min(namesArray.size(), (size_t)256));} } - if (namesArray.size()){memcpy(strmP, namesArray.data(), std::min(namesArray.size(), (size_t)256));} + } + if (triggIt->isMember("params") && !(*triggIt)["params"].isNull()){ + tPage.setString("params", (*triggIt)["params"].asStringRef(), i); + }else{ + tPage.setString("params", "", i); + } + if (triggIt->isMember("default") && !(*triggIt)["default"].isNull()){ + tPage.setString("default", (*triggIt)["default"].asStringRef(), i); + }else{ + tPage.setString("default", "", i); } } - if (triggIt->isMember("params") && !(*triggIt)["params"].isNull()){ - tPage.setString("params", (*triggIt)["params"].asStringRef(), i); - }else{ - tPage.setString("params", "", i); - } - if (triggIt->isMember("default") && !(*triggIt)["default"].isNull()){ - tPage.setString("default", (*triggIt)["default"].asStringRef(), i); - }else{ - tPage.setString("default", "", i); - } - } - ++i; + ++i; + } + tPage.setRCount(std::min(i, max)); + tPage.setEndPos(std::min(i, max)); } - tPage.setRCount(std::min(i, max)); - tPage.setEndPos(std::min(i, max)); } }