diff options
Diffstat (limited to 'node/Node.cpp')
| -rw-r--r-- | node/Node.cpp | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/node/Node.cpp b/node/Node.cpp index c9aef8a5..785fc634 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -188,15 +188,31 @@ struct _NodeImpl volatile bool running; volatile bool terminateNow; - // Helper used to rapidly terminate from run() + // run() calls this on all return paths inline Node::ReasonForTermination terminateBecause(Node::ReasonForTermination r,const char *rstr) { RuntimeEnvironment *_r = &renv; LOG("terminating: %s",rstr); + renv.shutdownInProgress = true; + Thread::sleep(500); + +#ifndef __WINDOWS__ + delete renv.netconfService; +#endif + delete renv.nc; + delete renv.sysEnv; + delete renv.topology; + delete renv.demarc; + delete renv.sw; + delete renv.multicaster; + delete renv.prng; + delete renv.log; + reasonForTerminationStr = rstr; reasonForTermination = r; running = false; + return r; } }; @@ -257,7 +273,6 @@ Node::Node(const char *hp) _impl(new _NodeImpl) { _NodeImpl *impl = (_NodeImpl *)_impl; - if ((hp)&&(strlen(hp) > 0)) impl->renv.homePath = hp; else impl->renv.homePath = ZT_DEFAULTS.defaultHomePath; @@ -269,34 +284,9 @@ Node::Node(const char *hp) Node::~Node() { - _NodeImpl *impl = (_NodeImpl *)_impl; - -#ifndef __WINDOWS__ - delete impl->renv.netconfService; -#endif - - delete impl->renv.nc; - delete impl->renv.sysEnv; - delete impl->renv.topology; - delete impl->renv.sw; - delete impl->renv.multicaster; - delete impl->renv.demarc; - delete impl->renv.prng; - delete impl->renv.log; - - delete impl; + delete (_NodeImpl *)_impl; } -/** - * Execute node in current thread - * - * This does not return until the node shuts down. Shutdown may be caused - * by an internally detected condition such as a new upgrade being - * available or a fatal error, or it may be signaled externally using - * the terminate() method. - * - * @return Reason for termination - */ Node::ReasonForTermination Node::run() throw() { @@ -375,9 +365,9 @@ Node::ReasonForTermination Node::run() // Create the core objects in RuntimeEnvironment: node config, demarcation // point, switch, network topology database, and system environment // watcher. - _r->demarc = new Demarc(_r); _r->multicaster = new Multicaster(); _r->sw = new Switch(_r); + _r->demarc = new Demarc(_r); _r->topology = new Topology(_r,(_r->homePath + ZT_PATH_SEPARATOR_S + "peer.db").c_str()); _r->sysEnv = new SysEnv(_r); try { |
