From f87326fc21fb6db0944730ba1fe961d8bb249450 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 11 Jan 2018 14:29:57 -0800 Subject: Fixes for lock ordering -- GitHub issue #573 --- node/Mutex.hpp | 3 ++- node/Node.hpp | 2 +- node/Topology.cpp | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) (limited to 'node') diff --git a/node/Mutex.hpp b/node/Mutex.hpp index cbd80524..e0917f01 100644 --- a/node/Mutex.hpp +++ b/node/Mutex.hpp @@ -38,7 +38,8 @@ namespace ZeroTier { -#if defined(__GNUC__) && (defined(__amd64) || defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || defined(__AMD64) || defined(__AMD64__) || defined(_M_X64)) +//#if defined(__GNUC__) && (defined(__amd64) || defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || defined(__AMD64) || defined(__AMD64__) || defined(_M_X64)) +#if 0 // Inline ticket lock on x64 systems with GCC and CLANG (Mac, Linux) -- this is really fast as long as locking durations are very short class Mutex : NonCopyable diff --git a/node/Node.hpp b/node/Node.hpp index 82f35c56..79284b63 100644 --- a/node/Node.hpp +++ b/node/Node.hpp @@ -284,7 +284,7 @@ private: Address _remoteTraceTarget; enum Trace::Level _remoteTraceLevel; - int64_t _now; + volatile int64_t _now; int64_t _lastPingCheck; int64_t _lastHousekeepingRun; int64_t _lastMemoizedTraceSettings; diff --git a/node/Topology.cpp b/node/Topology.cpp index fa9868e9..17a0eee4 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -162,8 +162,8 @@ SharedPtr Topology::getUpstreamPeer() unsigned int bestq = ~((unsigned int)0); const SharedPtr *best = (const SharedPtr *)0; - Mutex::Lock _l1(_peers_m); - Mutex::Lock _l2(_upstreams_m); + Mutex::Lock _l2(_peers_m); + Mutex::Lock _l1(_upstreams_m); for(std::vector
::const_iterator a(_upstreamAddresses.begin());a!=_upstreamAddresses.end();++a) { const SharedPtr *p = _peers.get(*a); @@ -252,8 +252,8 @@ bool Topology::addWorld(void *tPtr,const World &newWorld,bool alwaysAcceptNew) if ((newWorld.type() != World::TYPE_PLANET)&&(newWorld.type() != World::TYPE_MOON)) return false; - Mutex::Lock _l1(_upstreams_m); Mutex::Lock _l2(_peers_m); + Mutex::Lock _l1(_upstreams_m); World *existing = (World *)0; switch(newWorld.type()) { @@ -341,8 +341,8 @@ void Topology::addMoon(void *tPtr,const uint64_t id,const Address &seed) void Topology::removeMoon(void *tPtr,const uint64_t id) { - Mutex::Lock _l1(_upstreams_m); Mutex::Lock _l2(_peers_m); + Mutex::Lock _l1(_upstreams_m); std::vector nm; for(std::vector::const_iterator m(_moons.begin());m!=_moons.end();++m) { -- cgit v1.2.3