Core/Warden: Switch to multi-threaded packet processing for warden
This commit is contained in:
@@ -769,7 +769,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
|||||||
/*0x2E4*/ { "SMSG_AREA_SPIRIT_HEALER_TIME", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
/*0x2E4*/ { "SMSG_AREA_SPIRIT_HEALER_TIME", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||||
/*0x2E5*/ { "CMSG_GM_UNTEACH", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
/*0x2E5*/ { "CMSG_GM_UNTEACH", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||||
/*0x2E6*/ { "SMSG_WARDEN_DATA", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
/*0x2E6*/ { "SMSG_WARDEN_DATA", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||||
/*0x2E7*/ { "CMSG_WARDEN_DATA", STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode },
|
/*0x2E7*/ { "CMSG_WARDEN_DATA", STATUS_AUTHED, PROCESS_THREADSAFE, &WorldSession::HandleWardenDataOpcode },
|
||||||
/*0x2E8*/ { "SMSG_GROUP_JOINED_BATTLEGROUND", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
/*0x2E8*/ { "SMSG_GROUP_JOINED_BATTLEGROUND", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||||
/*0x2E9*/ { "MSG_BATTLEGROUND_PLAYER_POSITIONS", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlegroundPlayerPositionsOpcode},
|
/*0x2E9*/ { "MSG_BATTLEGROUND_PLAYER_POSITIONS", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlegroundPlayerPositionsOpcode},
|
||||||
/*0x2EA*/ { "CMSG_PET_STOP_ATTACK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetStopAttack },
|
/*0x2EA*/ { "CMSG_PET_STOP_ATTACK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetStopAttack },
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
#include "WardenCheckMgr.h"
|
#include "WardenCheckMgr.h"
|
||||||
#include "Warden.h"
|
#include "Warden.h"
|
||||||
|
|
||||||
|
|
||||||
WardenCheckMgr::WardenCheckMgr()
|
WardenCheckMgr::WardenCheckMgr()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -49,17 +48,6 @@ void WardenCheckMgr::LoadWardenChecks()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For reload case
|
|
||||||
for (uint16 i = 0; i < CheckStore.size(); ++i)
|
|
||||||
delete CheckStore[i];
|
|
||||||
|
|
||||||
CheckStore.clear();
|
|
||||||
|
|
||||||
for (CheckResultContainer::iterator itr = CheckResultStore.begin(); itr != CheckResultStore.end(); ++itr)
|
|
||||||
delete itr->second;
|
|
||||||
CheckResultStore.clear();
|
|
||||||
|
|
||||||
|
|
||||||
QueryResult result = WorldDatabase.Query("SELECT MAX(id) FROM warden_checks");
|
QueryResult result = WorldDatabase.Query("SELECT MAX(id) FROM warden_checks");
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
@@ -166,13 +154,13 @@ void WardenCheckMgr::LoadWardenOverrides()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Field* fields = result->Fetch();
|
|
||||||
|
|
||||||
uint32 count = 0;
|
uint32 count = 0;
|
||||||
|
|
||||||
|
ACE_WRITE_GUARD(ACE_RW_Mutex, g, _checkStoreLock);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
fields = result->Fetch();
|
Field* fields = result->Fetch();
|
||||||
|
|
||||||
uint16 checkId = fields[0].GetUInt16();
|
uint16 checkId = fields[0].GetUInt16();
|
||||||
uint8 action = fields[1].GetUInt8();
|
uint8 action = fields[1].GetUInt8();
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ class WardenCheckMgr
|
|||||||
void LoadWardenChecks();
|
void LoadWardenChecks();
|
||||||
void LoadWardenOverrides();
|
void LoadWardenOverrides();
|
||||||
|
|
||||||
|
ACE_RW_Mutex _checkStoreLock;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CheckContainer CheckStore;
|
CheckContainer CheckStore;
|
||||||
CheckResultContainer CheckResultStore;
|
CheckResultContainer CheckResultStore;
|
||||||
|
|||||||
@@ -212,6 +212,8 @@ void WardenWin::RequestData()
|
|||||||
ByteBuffer buff;
|
ByteBuffer buff;
|
||||||
buff << uint8(WARDEN_SMSG_CHEAT_CHECKS_REQUEST);
|
buff << uint8(WARDEN_SMSG_CHEAT_CHECKS_REQUEST);
|
||||||
|
|
||||||
|
ACE_READ_GUARD(ACE_RW_Mutex, g, sWardenCheckMgr->_checkStoreLock);
|
||||||
|
|
||||||
for (uint32 i = 0; i < sWorld->getIntConfig(CONFIG_WARDEN_NUM_OTHER_CHECKS); ++i)
|
for (uint32 i = 0; i < sWorld->getIntConfig(CONFIG_WARDEN_NUM_OTHER_CHECKS); ++i)
|
||||||
{
|
{
|
||||||
// If todo list is done break loop (will be filled on next Update() run)
|
// If todo list is done break loop (will be filled on next Update() run)
|
||||||
@@ -377,6 +379,8 @@ void WardenWin::HandleData(ByteBuffer &buff)
|
|||||||
uint8 type;
|
uint8 type;
|
||||||
uint16 checkFailed = 0;
|
uint16 checkFailed = 0;
|
||||||
|
|
||||||
|
ACE_READ_GUARD(ACE_RW_Mutex, g, sWardenCheckMgr->_checkStoreLock);
|
||||||
|
|
||||||
for (std::list<uint16>::iterator itr = _currentChecks.begin(); itr != _currentChecks.end(); ++itr)
|
for (std::list<uint16>::iterator itr = _currentChecks.begin(); itr != _currentChecks.end(); ++itr)
|
||||||
{
|
{
|
||||||
rd = sWardenCheckMgr->GetWardenDataById(*itr);
|
rd = sWardenCheckMgr->GetWardenDataById(*itr);
|
||||||
|
|||||||
Reference in New Issue
Block a user