From e111f2ac8fd9309d2911b0e36e0579094fe2d7a5 Mon Sep 17 00:00:00 2001 From: Stephane Letz Date: Wed, 9 Jan 2013 16:05:48 +0100 Subject: [PATCH] Protect shared fSynchroTable access with a mutex. --- common/JackClient.cpp | 3 +++ common/JackGlobals.cpp | 1 + common/JackGlobals.h | 3 ++- common/JackLibClient.cpp | 13 +++++++++++-- common/JackServerGlobals.cpp | 1 - common/JackServerGlobals.h | 1 - posix/JackSocketServerNotifyChannel.cpp | 1 - windows/JackAtomic_os.h | 6 +++--- 8 files changed, 20 insertions(+), 9 deletions(-) diff --git a/common/JackClient.cpp b/common/JackClient.cpp index fd12bc22..3ab96308 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -117,7 +117,10 @@ int JackClient::Close() } fChannel->Close(); + assert(JackGlobals::fSynchroMutex); + JackGlobals::fSynchroMutex->Lock(); fSynchroTable[GetClientControl()->fRefNum].Disconnect(); + JackGlobals::fSynchroMutex->Unlock(); JackGlobals::fClientTable[GetClientControl()->fRefNum] = NULL; return result; } diff --git a/common/JackGlobals.cpp b/common/JackGlobals.cpp index b3f8eee7..951cdd77 100644 --- a/common/JackGlobals.cpp +++ b/common/JackGlobals.cpp @@ -34,6 +34,7 @@ jack_tls_key JackGlobals::fKeyLogFunction; static bool fKeyLogFunctionInitialized = jack_tls_allocate_key(&JackGlobals::fKeyLogFunction); JackMutex* JackGlobals::fOpenMutex = new JackMutex(); +JackMutex* JackGlobals::fSynchroMutex = new JackMutex(); volatile bool JackGlobals::fServerRunning = false; JackClient* JackGlobals::fClientTable[CLIENT_NUM] = {}; diff --git a/common/JackGlobals.h b/common/JackGlobals.h index 3c87c6ba..5d7c2421 100644 --- a/common/JackGlobals.h +++ b/common/JackGlobals.h @@ -41,8 +41,9 @@ struct JackGlobals { static jack_tls_key fNotificationThread; static jack_tls_key fKeyLogFunction; static JackMutex* fOpenMutex; + static JackMutex* fSynchroMutex; static volatile bool fServerRunning; - static JackClient* fClientTable[]; + static JackClient* fClientTable[CLIENT_NUM]; static bool fVerbose; #ifndef WIN32 static jack_thread_creator_t fJackThreadCreator; diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp index 72b05642..d8ea3774 100644 --- a/common/JackLibClient.cpp +++ b/common/JackLibClient.cpp @@ -84,6 +84,7 @@ JackLibClient::~JackLibClient() int JackLibClient::Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status) { int shared_engine, shared_client, shared_graph, result; + bool res; jack_log("JackLibClient::Open name = %s", name); strncpy(fServerName, server_name, sizeof(fServerName)); @@ -122,7 +123,11 @@ int JackLibClient::Open(const char* server_name, const char* name, int uuid, jac SetupDriverSync(false); // Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process - if (!fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName)) { + assert(JackGlobals::fSynchroMutex); + JackGlobals::fSynchroMutex->Lock(); + res = fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName); + JackGlobals::fSynchroMutex->Unlock(); + if (!res) { jack_error("Cannot ConnectSemaphore %s client", name_res); goto error; } @@ -145,6 +150,8 @@ error: int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2) { int res = 0; + assert(JackGlobals::fSynchroMutex); + JackGlobals::fSynchroMutex->Lock(); // Done all time switch (notify) { @@ -157,11 +164,13 @@ int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int case kRemoveClient: jack_log("JackClient::RemoveClient name = %s, ref = %ld ", name, refnum); - if (GetClientControl() && strcmp(GetClientControl()->fName, name) != 0) + if (GetClientControl() && strcmp(GetClientControl()->fName, name) != 0) { res = fSynchroTable[refnum].Disconnect() ? 0 : -1; + } break; } + JackGlobals::fSynchroMutex->Unlock(); return res; } diff --git a/common/JackServerGlobals.cpp b/common/JackServerGlobals.cpp index 21feb7f5..7d909bed 100644 --- a/common/JackServerGlobals.cpp +++ b/common/JackServerGlobals.cpp @@ -31,7 +31,6 @@ namespace Jack JackServer* JackServerGlobals::fInstance; unsigned int JackServerGlobals::fUserCount; -int JackServerGlobals::fRTNotificationSocket; std::map JackServerGlobals::fSlavesList; std::map JackServerGlobals::fInternalsList; diff --git a/common/JackServerGlobals.h b/common/JackServerGlobals.h index 69b8979e..a98596de 100644 --- a/common/JackServerGlobals.h +++ b/common/JackServerGlobals.h @@ -39,7 +39,6 @@ struct SERVER_EXPORT JackServerGlobals { static JackServer* fInstance; static unsigned int fUserCount; - static int fRTNotificationSocket; // For debugging purpose static std::map fSlavesList; static std::map fInternalsList; diff --git a/posix/JackSocketServerNotifyChannel.cpp b/posix/JackSocketServerNotifyChannel.cpp index 5f4b6032..4904b6ea 100644 --- a/posix/JackSocketServerNotifyChannel.cpp +++ b/posix/JackSocketServerNotifyChannel.cpp @@ -34,7 +34,6 @@ int JackSocketServerNotifyChannel::Open(const char* server_name) return -1; } else { fRequestSocket.SetNonBlocking(true); - JackServerGlobals::fRTNotificationSocket = fRequestSocket.GetFd(); return 0; } } diff --git a/windows/JackAtomic_os.h b/windows/JackAtomic_os.h index 0a393f7a..2de2aa43 100644 --- a/windows/JackAtomic_os.h +++ b/windows/JackAtomic_os.h @@ -64,9 +64,9 @@ static inline char CAS(volatile UInt32 value, UInt32 newvalue, volatile void* ad "# CAS \n\t" LOCK "cmpxchg %2, (%1) \n\t" "sete %0 \n\t" - : "=a" (ret) - : "c" (addr), "d" (newvalue), "a" (value) - ); + : "=a" (ret) + : "c" (addr), "d" (newvalue), "a" (value) + ); return ret; }