diff options
Diffstat (limited to 'node/Node.cpp')
-rw-r--r-- | node/Node.cpp | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/node/Node.cpp b/node/Node.cpp index 830ee354..85029e81 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -74,8 +74,9 @@ struct _NodeImpl RuntimeEnvironment renv; std::string reasonForTerminationStr; Node::ReasonForTermination reasonForTermination; - bool started; - bool running; + volatile bool started; + volatile bool running; + volatile bool updateStatusNow; volatile bool terminateNow; // Helper used to rapidly terminate from run() @@ -104,6 +105,7 @@ Node::Node(const char *hp,const char *urlPrefix,const char *configAuthorityIdent impl->reasonForTermination = Node::NODE_RUNNING; impl->started = false; impl->running = false; + impl->updateStatusNow = false; impl->terminateNow = false; } @@ -236,6 +238,8 @@ Node::ReasonForTermination Node::run() } try { + std::string statusPath(_r->homePath + ZT_PATH_SEPARATOR_S + "status"); + uint64_t lastPingCheck = 0; uint64_t lastTopologyClean = Utils::now(); // don't need to do this immediately uint64_t lastNetworkFingerprintCheck = 0; @@ -243,6 +247,7 @@ Node::ReasonForTermination Node::run() uint64_t networkConfigurationFingerprint = _r->sysEnv->getNetworkConfigurationFingerprint(); uint64_t lastMulticastCheck = 0; uint64_t lastMulticastAnnounceAll = 0; + uint64_t lastStatusUpdate = 0; long lastDelayDelta = 0; LOG("%s starting version %s",_r->identity.address().toString().c_str(),versionString()); @@ -373,6 +378,20 @@ Node::ReasonForTermination Node::run() _r->topology->clean(); // happens in background } + if (((now - lastStatusUpdate) >= ZT_STATUS_OUTPUT_PERIOD)||(impl->updateStatusNow)) { + lastStatusUpdate = now; + impl->updateStatusNow = false; + FILE *statusf = ::fopen(statusPath.c_str(),"w"); + if (statusf) { + try { + _r->topology->eachPeer(Topology::DumpPeerStatistics(statusf)); + } catch ( ... ) { + TRACE("unexpected exception updating status dump"); + } + ::fclose(statusf); + } + } + try { unsigned long delay = std::min((unsigned long)ZT_MIN_SERVICE_LOOP_INTERVAL,_r->sw->doTimerTasks()); uint64_t start = Utils::now(); @@ -391,11 +410,6 @@ Node::ReasonForTermination Node::run() return impl->terminateBecause(Node::NODE_NORMAL_TERMINATION,"normal termination"); } -/** - * Obtain a human-readable reason for node termination - * - * @return Reason for node termination or NULL if run() has not returned - */ const char *Node::reasonForTermination() const throw() { @@ -404,19 +418,18 @@ const char *Node::reasonForTermination() const return ((_NodeImpl *)_impl)->reasonForTerminationStr.c_str(); } -/** - * Cause run() to return with NODE_NORMAL_TERMINATION - * - * This can be called from a signal handler or another thread to signal a - * running node to shut down. Shutdown may take a few seconds, so run() - * may not return instantly. Multiple calls are ignored. - */ void Node::terminate() throw() { ((_NodeImpl *)_impl)->terminateNow = true; } +void Node::updateStatusNow() + throw() +{ + ((_NodeImpl *)_impl)->updateStatusNow = true; +} + class _VersionStringMaker { public: |