From 22467d603e7146fa2d1e4b008e845ffd91e4188d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 27 Nov 2015 10:00:57 +0100 Subject: [PATCH] Added support for clients and lastms requests in active_streams API call --- src/controller/controller_statistics.cpp | 41 +++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/controller/controller_statistics.cpp b/src/controller/controller_statistics.cpp index 072f569a..d179cf28 100644 --- a/src/controller/controller_statistics.cpp +++ b/src/controller/controller_statistics.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include "controller_statistics.h" #include "controller_limits.h" @@ -594,16 +596,53 @@ void Controller::fillClients(JSON::Value & req, JSON::Value & rep){ void Controller::fillActive(JSON::Value & req, JSON::Value & rep){ //collect the data first std::set streams; + std::map clients; + unsigned int t = Util::epoch() - 5; //check all sessions if (sessions.size()){ for (std::map::iterator it = sessions.begin(); it != sessions.end(); it++){ streams.insert(it->first.streamName); + if (it->second.hasDataFor(t)){ + clients[it->first.streamName]++; + } } } //Good, now output what we found... rep.null(); for (std::set::iterator it = streams.begin(); it != streams.end(); it++){ - rep.append(*it); + if (req.isArray()){ + rep[*it].null(); + jsonForEach(req, j){ + if (j->asStringRef() == "clients"){ + rep[*it].append((long long)clients[*it]); + } + if (j->asStringRef() == "lastms"){ + char pageId[NAME_BUFFER_SIZE]; + IPC::sharedPage streamIndex; + snprintf(pageId, NAME_BUFFER_SIZE, SHM_STREAM_INDEX, it->c_str()); + streamIndex.init(pageId, DEFAULT_META_PAGE_SIZE, false, false); + if (streamIndex.mapped){ + IPC::semaphore metaLocker(std::string("liveMeta@" + (*it)).c_str(), O_CREAT | O_RDWR, (S_IRWXU|S_IRWXG|S_IRWXO), 1); + metaLocker.wait(); + DTSC::Scan strm = DTSC::Packet(streamIndex.mapped, streamIndex.len, true).getScan(); + long long lms = 0; + DTSC::Scan trcks = strm.getMember("tracks"); + unsigned int trcks_ctr = trcks.getSize(); + for (unsigned int i = 0; i < trcks_ctr; ++i){ + if (trcks.getIndice(i).getMember("lastms").asInt() > lms){ + lms = trcks.getIndice(i).getMember("lastms").asInt(); + } + } + rep[*it].append(lms); + metaLocker.post(); + }else{ + rep[*it].append(-1ll); + } + } + } + }else{ + rep.append(*it); + } } //all done! return is by reference, so no need to return anything here. }