From d425193e392ee14695faa75d7f6d7a7fd3ea4dd2 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 29 Jul 2014 22:23:43 +0300 Subject: Use thread safe way for ipc interaction. --- src/gui/gui.cpp | 4 ++++ src/net/ipc.cpp | 33 ++++++++++++++++++++++++++++++--- src/net/ipc.h | 8 ++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 779bec99c..7ac1273bd 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -100,6 +100,8 @@ #include "utils/langs.h" #include "utils/timer.h" +#include "net/ipc.h" + #include "debug.h" // Guichan stuff @@ -347,6 +349,8 @@ void Gui::slowLogic() if (mTime != time) { logger->flush(); + if (ipc) + ipc->flush(); mTime = time; } diff --git a/src/net/ipc.cpp b/src/net/ipc.cpp index 629a069f5..22fbb4ce4 100644 --- a/src/net/ipc.cpp +++ b/src/net/ipc.cpp @@ -37,8 +37,11 @@ IPC *ipc = nullptr; IPC::IPC() : mNumReqs(0), mSocket(nullptr), + mDelayedCommands(), mThread(nullptr), + mMutex(SDL_CreateMutex()), mPort(44007U), + mThreadLocked(false), mListen(false) { } @@ -51,6 +54,8 @@ IPC::~IPC() TcpNet::closeSocket(mSocket); mSocket = nullptr; } + SDL_DestroyMutex(mMutex); + mMutex = nullptr; int status; if (mThread && SDL_GetThreadID(mThread)) SDL_WaitThread(mThread, &status); @@ -115,10 +120,14 @@ int IPC::acceptLoop(void *ptr) } std::string req(data); - req = trim(req); + trim(req); + + ipc1->mThreadLocked = true; + SDL_mutexP(ipc1->mMutex); + ipc1->mDelayedCommands.push_back(req); + SDL_mutexV(ipc1->mMutex); + ipc1->mThreadLocked = false; - if (chatWindow) - chatWindow->chatInput(req); ipc1->mNumReqs ++; const std::string resp = strprintf("[%d] %s\n", ipc1->mNumReqs, req.c_str()); @@ -176,3 +185,21 @@ void IPC::start() } delete2(ipc); } + +void IPC::flush() +{ + if (!mThreadLocked) + { + SDL_mutexP(mMutex); + if (chatWindow) + { + FOR_EACH (std::vector::const_iterator, it, + mDelayedCommands) + { + chatWindow->chatInput(*it); + } + } + mDelayedCommands.clear(); + SDL_mutexV(mMutex); + } +} diff --git a/src/net/ipc.h b/src/net/ipc.h index eb2e92c9b..739eb746e 100644 --- a/src/net/ipc.h +++ b/src/net/ipc.h @@ -23,6 +23,9 @@ #include "net/sdltcpnet.h" +#include +#include + #include class IPC final @@ -45,6 +48,8 @@ class IPC final unsigned short getPort() const A_WARN_UNUSED { return mPort; } + void flush(); + static int acceptLoop(void *ptr); static void start(); @@ -57,8 +62,11 @@ class IPC final unsigned int mNumReqs; TcpNet::Socket mSocket; + std::vector mDelayedCommands; SDL_Thread *mThread; + SDL_mutex *mMutex; unsigned short mPort; + volatile bool mThreadLocked; bool mListen; }; -- cgit v1.2.3-60-g2f50