From d0bdfc9c00fd921a79b24d8300cbf01a20f5a371 Mon Sep 17 00:00:00 2001 From: Jason Lokerson Date: Thu, 26 May 2016 17:17:59 -0700 Subject: [PATCH] Add a lock for `m_ContextIDs` and `m_ContextPtrs` These members are often accessed in an unsynchronized context, synchronize them by adding a spin lock to ensure we do not wind up with memory smashers when using Autonet in highly concurrent settings. --- src/autonet/AutoNetServerImpl.cpp | 2 ++ src/autonet/AutoNetServerImpl.hpp | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/autonet/AutoNetServerImpl.cpp b/src/autonet/AutoNetServerImpl.cpp index 270090f97..4c77206cb 100644 --- a/src/autonet/AutoNetServerImpl.cpp +++ b/src/autonet/AutoNetServerImpl.cpp @@ -322,6 +322,7 @@ void AutoNetServerImpl::HandleUnsubscribe(websocketpp::connection_hdl hdl) { int AutoNetServerImpl::ResolveContextID(CoreContext* ctxt) { static int counter = 0; + std::lock_guard lk(m_lock); if(m_ContextIDs.find(ctxt) == m_ContextIDs.end()){ m_ContextIDs[ctxt] = counter; m_ContextPtrs[counter] = ctxt; @@ -333,6 +334,7 @@ int AutoNetServerImpl::ResolveContextID(CoreContext* ctxt) { } CoreContext* AutoNetServerImpl::ResolveContextID(int id) { + std::lock_guard lk(m_lock); return m_ContextPtrs.at(id); } diff --git a/src/autonet/AutoNetServerImpl.hpp b/src/autonet/AutoNetServerImpl.hpp index d214e695f..83faeda75 100644 --- a/src/autonet/AutoNetServerImpl.hpp +++ b/src/autonet/AutoNetServerImpl.hpp @@ -135,7 +135,8 @@ class AutoNetServerImpl: // Set of all subscribers std::set> m_Subscribers; - // one-to-one map of contexts to integers + // one-to-one map of contexts to integers, and a lock because we use this in an unsynchronized setting + autowiring::spin_lock m_lock; std::map m_ContextIDs; std::map m_ContextPtrs;