瀏覽代碼

Back off from thrashing shutdownIfUnreadableCheck, fix bug in control service.

Adam Ierymenko 11 年之前
父節點
當前提交
6b76cac6cf
共有 2 個文件被更改,包括 13 次插入8 次删除
  1. 1 0
      control/NodeControlService.cpp
  2. 12 8
      node/Node.cpp

+ 1 - 0
control/NodeControlService.cpp

@@ -71,6 +71,7 @@ void NodeControlService::threadMain()
 			} else if ((_node->initialized())&&(_node->address())) {
 				Utils::snprintf(tmp,sizeof(tmp),"%s%.10llx",ZT_IPC_ENDPOINT_BASE,(unsigned long long)_node->address());
 				_listener = new IpcListener(tmp,&_CBcommandHandler,this);
+				break;
 			}
 			Thread::sleep(100); // wait for Node to start
 		}

+ 12 - 8
node/Node.cpp

@@ -471,6 +471,7 @@ Node::ReasonForTermination Node::run()
 		uint64_t lastSupernodePingCheck = 0;
 		uint64_t lastBeacon = 0;
 		uint64_t lastRootTopologyFetch = 0;
+		uint64_t lastShutdownIfUnreadableCheck = 0;
 		long lastDelayDelta = 0;
 
 		uint64_t networkConfigurationFingerprint = 0;
@@ -480,22 +481,25 @@ Node::ReasonForTermination Node::run()
 		_r->initialized = true;
 
 		while (impl->reasonForTermination == NODE_RUNNING) {
+			uint64_t now = Utils::now();
+			bool resynchronize = false;
+
 			/* This is how the service automatically shuts down when the OSX .app is
 			 * thrown in the trash. It's not used on any other platform for now but
 			 * could do similar things. It's disabled on Windows since it doesn't really
 			 * work there. */
 #ifdef __UNIX_LIKE__
-			if (Utils::fileExists(shutdownIfUnreadablePath.c_str(),false)) {
-				FILE *tmpf = fopen(shutdownIfUnreadablePath.c_str(),"r");
-				if (!tmpf)
-					return impl->terminateBecause(Node::NODE_NORMAL_TERMINATION,"shutdownIfUnreadable exists but is not readable");
-				fclose(tmpf);
+			if ((now - lastShutdownIfUnreadableCheck) > 10000) {
+				lastShutdownIfUnreadableCheck = now;
+				if (Utils::fileExists(shutdownIfUnreadablePath.c_str(),false)) {
+					int tmpfd = ::open(shutdownIfUnreadablePath.c_str(),O_RDONLY,0);
+					if (tmpfd < 0)
+						return impl->terminateBecause(Node::NODE_NORMAL_TERMINATION,"shutdownIfUnreadable exists but is not readable");
+					else ::close(tmpfd);
+				}
 			}
 #endif
 
-			uint64_t now = Utils::now();
-			bool resynchronize = false;
-
 			// If it looks like the computer slept and woke, resynchronize.
 			if (lastDelayDelta >= ZT_SLEEP_WAKE_DETECTION_THRESHOLD) {
 				resynchronize = true;