summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2017-06-26 09:11:30 +0200
committerGitHub <noreply@github.com>2017-06-26 09:11:30 +0200
commitf6bab71d055ad0e1bf908ffcd79ca4398b07fdc5 (patch)
tree45d75d208a39bea42107b22e31924801c789b509
parentCorrected APIDoc for cBlockArea and exported missing functions (#3808) (diff)
downloadcuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.tar
cuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.tar.gz
cuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.tar.bz2
cuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.tar.lz
cuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.tar.xz
cuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.tar.zst
cuberite-f6bab71d055ad0e1bf908ffcd79ca4398b07fdc5.zip
-rw-r--r--src/ClientHandle.cpp10
-rw-r--r--src/ClientHandle.h2
2 files changed, 6 insertions, 6 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index fe85ddfb8..1b63153d2 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -95,7 +95,7 @@ cClientHandle::cClientHandle(const AString & a_IPString, int a_ViewDistance) :
m_LastPlacedSign(0, -1, 0),
m_ProtocolVersion(0)
{
- m_Protocol = new cProtocolRecognizer(this);
+ m_Protocol = cpp14::make_unique<cProtocolRecognizer>(this);
s_ClientCount++; // Not protected by CS because clients are always constructed from the same thread
m_UniqueID = s_ClientCount;
@@ -143,8 +143,7 @@ cClientHandle::~cClientHandle()
SendDisconnect("Server shut down? Kthnxbai");
}
- delete m_Protocol;
- m_Protocol = nullptr;
+ m_Protocol.reset();
LOGD("ClientHandle at %p deleted", static_cast<void *>(this));
}
@@ -171,12 +170,13 @@ void cClientHandle::Destroy(void)
}
LOGD("%s: destroying client %p, \"%s\" @ %s", __FUNCTION__, static_cast<void *>(this), m_Username.c_str(), m_IPString.c_str());
+ auto player = m_Player;
+ m_Self.reset();
{
cCSLock lock(m_CSState);
- m_State = csDestroyed;
+ m_State = csDestroyed; // Tick thread is allowed to call destructor async at any time after this
}
- auto player = m_Player;
if (player != nullptr)
{
auto world = player->GetWorld();
diff --git a/src/ClientHandle.h b/src/ClientHandle.h
index 0b51c50cd..4c37262c2 100644
--- a/src/ClientHandle.h
+++ b/src/ClientHandle.h
@@ -405,7 +405,7 @@ private:
std::unordered_set<cChunkCoords, cChunkCoordsHash> m_ChunksToSend; // Chunks that need to be sent to the player (queued because they weren't generated yet or there's not enough time to send them)
cChunkCoordsList m_SentChunks; // Chunks that are currently sent to the client
- cProtocol * m_Protocol;
+ std::unique_ptr<cProtocol> m_Protocol;
/** Protects m_IncomingData against multithreaded access. */
cCriticalSection m_CSIncomingData;