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/net/ipc.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'src/net/ipc.cpp') 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); + } +} -- cgit v1.2.3-60-g2f50