summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2013-10-08 23:09:49 +0300
committerAndrei Karas <akaras@inbox.ru>2013-10-08 23:09:49 +0300
commit4f948c82ea95c6b9fac307f455fe91851e27017a (patch)
tree4eaa6aecdd68e2da17433517212b92028bf565e0
parent72e775bac71b2d4b5103a0e8a6f03875b1617321 (diff)
downloadmv-4f948c82ea95c6b9fac307f455fe91851e27017a.tar.gz
mv-4f948c82ea95c6b9fac307f455fe91851e27017a.tar.bz2
mv-4f948c82ea95c6b9fac307f455fe91851e27017a.tar.xz
mv-4f948c82ea95c6b9fac307f455fe91851e27017a.zip
split network mutexe into read and write mutexes.
-rw-r--r--src/net/ea/network.cpp26
-rw-r--r--src/net/ea/network.h3
-rw-r--r--src/net/eathena/network.cpp8
-rw-r--r--src/net/tmwa/network.cpp8
4 files changed, 25 insertions, 20 deletions
diff --git a/src/net/ea/network.cpp b/src/net/ea/network.cpp
index 87ab01722..ab76fd220 100644
--- a/src/net/ea/network.cpp
+++ b/src/net/ea/network.cpp
@@ -61,7 +61,8 @@ Network::Network() :
mState(IDLE),
mError(),
mWorkerThread(nullptr),
- mMutex(SDL_CreateMutex()),
+ mMutexIn(SDL_CreateMutex()),
+ mMutexOut(SDL_CreateMutex()),
mSleep(config.getIntValue("networksleep"))
{
TcpNet::init();
@@ -72,8 +73,10 @@ Network::~Network()
if (mState != IDLE && mState != NET_ERROR)
disconnect();
- SDL_DestroyMutex(mMutex);
- mMutex = nullptr;
+ SDL_DestroyMutex(mMutexIn);
+ mMutexIn = nullptr;
+ SDL_DestroyMutex(mMutexOut);
+ mMutexOut = nullptr;
delete []mInBuffer;
delete []mOutBuffer;
@@ -146,25 +149,26 @@ void Network::flush()
if (!mOutSize || mState != CONNECTED)
return;
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexOut);
const int ret = TcpNet::send(mSocket, mOutBuffer, mOutSize);
DEBUGLOG(std::string("Send ").append(toString(mOutSize)).append(" bytes"));
if (ret < static_cast<int>(mOutSize))
{
+ SDL_mutexV(mMutexOut);
setError("Error in TcpNet::send(): " +
std::string(TcpNet::getError()));
}
mOutSize = 0;
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexOut);
}
void Network::skip(const int len)
{
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexIn);
mToSkip += len;
if (!mInSize)
{
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
return;
}
@@ -179,7 +183,7 @@ void Network::skip(const int len)
mToSkip -= mInSize;
mInSize = 0;
}
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
}
bool Network::realConnect()
@@ -252,10 +256,10 @@ void Network::receive()
case 1:
{
// Receive data from the socket
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexIn);
if (mInSize > BUFFER_LIMIT)
{
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
SDL_Delay(100);
continue;
}
@@ -294,7 +298,7 @@ void Network::receive()
}
}
}
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
break;
}
diff --git a/src/net/ea/network.h b/src/net/ea/network.h
index 81a95566b..9298f021f 100644
--- a/src/net/ea/network.h
+++ b/src/net/ea/network.h
@@ -104,7 +104,8 @@ class Network
std::string mError;
SDL_Thread *mWorkerThread;
- SDL_mutex *mMutex;
+ SDL_mutex *mMutexIn;
+ SDL_mutex *mMutexOut;
int mSleep;
};
diff --git a/src/net/eathena/network.cpp b/src/net/eathena/network.cpp
index 4786d9ee7..481a945ba 100644
--- a/src/net/eathena/network.cpp
+++ b/src/net/eathena/network.cpp
@@ -162,7 +162,7 @@ void Network::dispatchMessages()
{
while (messageReady())
{
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexIn);
const int msgId = readWord(0);
int len = -1;
if (msgId == SMSG_SERVER_VERSION_RESPONSE)
@@ -183,7 +183,7 @@ void Network::dispatchMessages()
len = readWord(2);
MessageIn msg(mInBuffer, len);
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
if (len == 0)
{
@@ -210,7 +210,7 @@ bool Network::messageReady()
{
int len = -1;
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexIn);
if (mInSize >= 2)
{
const int msgId = readWord(0);
@@ -226,7 +226,7 @@ bool Network::messageReady()
}
const bool ret = (mInSize >= static_cast<unsigned int>(len));
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
return ret;
}
diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp
index 175713d49..9c1508ccb 100644
--- a/src/net/tmwa/network.cpp
+++ b/src/net/tmwa/network.cpp
@@ -141,7 +141,7 @@ void Network::dispatchMessages()
BLOCK_START("Network::dispatchMessages 1")
while (messageReady())
{
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexIn);
BLOCK_START("Network::dispatchMessages 2")
const int msgId = readWord(0);
int len;
@@ -156,7 +156,7 @@ void Network::dispatchMessages()
len = readWord(2);
MessageIn msg(mInBuffer, len);
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
BLOCK_END("Network::dispatchMessages 2")
BLOCK_START("Network::dispatchMessages 3")
@@ -187,7 +187,7 @@ bool Network::messageReady()
{
int len = -1;
- SDL_mutexP(mMutex);
+ SDL_mutexP(mMutexIn);
if (mInSize >= 2)
{
const int msgId = readWord(0);
@@ -210,7 +210,7 @@ bool Network::messageReady()
}
const bool ret = (mInSize >= static_cast<unsigned int>(len));
- SDL_mutexV(mMutex);
+ SDL_mutexV(mMutexIn);
return ret;
}