aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2014-07-05 21:38:29 -0500
committerSubv <subv2112@gmail.com>2014-07-05 21:38:29 -0500
commitb5d5768d44d04ac8ecc066f13161b09c1cd5cf06 (patch)
tree468eed15b73cdd6b56a16f4783da715f23baa799 /src/server/game/Server
parent42b2041aebd9081626e4531d655a35cd924b7e35 (diff)
Fixed the crashes
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/WorldSession.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h4
-rw-r--r--src/server/game/Server/WorldTcpSession.cpp19
-rw-r--r--src/server/game/Server/WorldTcpSession.h7
4 files changed, 20 insertions, 16 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 68f06676fdb..a369eabfcdb 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -97,7 +97,7 @@ bool WorldSessionFilter::Process(WorldPacket* packet)
}
/// WorldSession constructor
-WorldSession::WorldSession(uint32 id, WorldTcpSession* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter):
+WorldSession::WorldSession(uint32 id, std::shared_ptr<WorldTcpSession> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter):
m_muteTime(mute_time),
m_timeOutTime(0),
AntiDOS(this),
@@ -149,7 +149,7 @@ WorldSession::~WorldSession()
if (m_Socket)
{
m_Socket->CloseSocket();
- m_Socket = NULL;
+ m_Socket = nullptr;
}
delete _warden;
@@ -420,7 +420,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
expireTime -= expireTime > diff ? diff : expireTime;
if (expireTime < diff || forceExit)
{
- m_Socket = NULL;
+ m_Socket = nullptr;
}
}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 709650a8119..d864a2ca76d 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -208,7 +208,7 @@ struct PacketCounter
class WorldSession
{
public:
- WorldSession(uint32 id, WorldTcpSession* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
+ WorldSession(uint32 id, std::shared_ptr<WorldTcpSession> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
~WorldSession();
bool PlayerLoading() const { return m_playerLoading; }
@@ -981,7 +981,7 @@ class WorldSession
uint32 m_GUIDLow; // set logined or recently logout player (while m_playerRecentlyLogout set)
Player* _player;
- WorldTcpSession* m_Socket;
+ std::shared_ptr<WorldTcpSession> m_Socket;
std::string m_Address; // Current Remote Address
// std::string m_LAddress; // Last Attempted Remote Adress - we can not set attempted ip for a non-existing session!
diff --git a/src/server/game/Server/WorldTcpSession.cpp b/src/server/game/Server/WorldTcpSession.cpp
index 6fd54fffc17..7f2b560f35b 100644
--- a/src/server/game/Server/WorldTcpSession.cpp
+++ b/src/server/game/Server/WorldTcpSession.cpp
@@ -28,6 +28,11 @@
using boost::asio::ip::tcp;
using boost::asio::streambuf;
+WorldTcpSession::WorldTcpSession(tcp::socket socket)
+ : _socket(std::move(socket)), _authSeed(static_cast<uint32>(rand32())), _worldSession(nullptr)
+{
+}
+
void WorldTcpSession::Start()
{
AsyncReadHeader();
@@ -54,7 +59,8 @@ void WorldTcpSession::HandleSendAuthSession()
void WorldTcpSession::AsyncReadHeader()
{
- _socket.async_read_some(boost::asio::buffer(_readBuffer, sizeof(ClientPktHeader)), [this](boost::system::error_code error, size_t transferedBytes)
+ auto self(shared_from_this());
+ _socket.async_read_some(boost::asio::buffer(_readBuffer, sizeof(ClientPktHeader)), [this, self](boost::system::error_code error, size_t transferedBytes)
{
if (!error && transferedBytes == sizeof(ClientPktHeader))
{
@@ -74,7 +80,8 @@ void WorldTcpSession::AsyncReadHeader()
void WorldTcpSession::AsyncReadData(size_t dataSize)
{
- _socket.async_read_some(boost::asio::buffer(&_readBuffer[sizeof(ClientPktHeader)], dataSize), [this, dataSize](boost::system::error_code error, size_t transferedBytes)
+ auto self(shared_from_this());
+ _socket.async_read_some(boost::asio::buffer(&_readBuffer[sizeof(ClientPktHeader)], dataSize), [this, dataSize, self](boost::system::error_code error, size_t transferedBytes)
{
if (!error && transferedBytes == dataSize)
{
@@ -104,12 +111,12 @@ void WorldTcpSession::AsyncReadData(size_t dataSize)
break;
}
- sScriptMgr->OnPacketReceive(this, packet);
+ sScriptMgr->OnPacketReceive(shared_from_this(), packet);
HandleAuthSession(packet);
break;
case CMSG_KEEP_ALIVE:
TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(this, packet);
+ sScriptMgr->OnPacketReceive(shared_from_this(), packet);
break;
default:
{
@@ -366,7 +373,7 @@ void WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
LoginDatabase.Execute(stmt);
// NOTE ATM the socket is single-threaded, have this in mind ...
- _worldSession = new WorldSession(id, this, AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter);
+ _worldSession = new WorldSession(id, shared_from_this(), AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter);
_authCrypt.Init(&k);
@@ -391,4 +398,4 @@ void WorldTcpSession::SendAuthResponseError(uint8 code)
packet << uint8(code);
AsyncWrite(packet);
-}
+} \ No newline at end of file
diff --git a/src/server/game/Server/WorldTcpSession.h b/src/server/game/Server/WorldTcpSession.h
index 8b1285b0a85..dedc248d7ec 100644
--- a/src/server/game/Server/WorldTcpSession.h
+++ b/src/server/game/Server/WorldTcpSession.h
@@ -40,13 +40,10 @@ struct ClientPktHeader
#pragma pack(pop)
-class WorldTcpSession
+class WorldTcpSession : public std::enable_shared_from_this<WorldTcpSession>
{
public:
- WorldTcpSession(tcp::socket socket) :
- _socket(std::move(socket)), _authSeed(static_cast<uint32> (rand32()))
- {
- }
+ WorldTcpSession(tcp::socket socket);
WorldTcpSession(WorldTcpSession const& right) = delete;
WorldTcpSession& operator=(WorldTcpSession const& right) = delete;