summaryrefslogtreecommitdiff
path: root/src/net/ipc.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2014-07-29 22:23:43 +0300
committerAndrei Karas <akaras@inbox.ru>2014-07-29 22:23:43 +0300
commitd425193e392ee14695faa75d7f6d7a7fd3ea4dd2 (patch)
tree1ea51b26a10554cdfa488960798e82caeec696bb /src/net/ipc.cpp
parent3941d588a3233176416edf90d1f248ac4cb0fe5e (diff)
downloadmv-d425193e392ee14695faa75d7f6d7a7fd3ea4dd2.tar.gz
mv-d425193e392ee14695faa75d7f6d7a7fd3ea4dd2.tar.bz2
mv-d425193e392ee14695faa75d7f6d7a7fd3ea4dd2.tar.xz
mv-d425193e392ee14695faa75d7f6d7a7fd3ea4dd2.zip
Use thread safe way for ipc interaction.
Diffstat (limited to 'src/net/ipc.cpp')
-rw-r--r--src/net/ipc.cpp33
1 files changed, 30 insertions, 3 deletions
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<std::string>::const_iterator, it,
+ mDelayedCommands)
+ {
+ chatWindow->chatInput(*it);
+ }
+ }
+ mDelayedCommands.clear();
+ SDL_mutexV(mMutex);
+ }
+}