#include "StdAfx.h" #include "DNIocpManager.h" #include "DNThreadManager.h" #include "DNConnection.h" #include "Log.h" #include "DNProtocol.h" #include "DNserviceConnection.h" #include "SpinBuffer.h" #include "DNSQLConnectionManager.h" #include "DNSQLMembership.h" #include "DNSQLWorld.h" CDNThreadManager g_ThreadManager; extern TDBConfig g_Config; CDNThreadManager::CDNThreadManager(void): CThreadManager() { } CDNThreadManager::~CDNThreadManager(void) { } #if defined(PRE_DEL_ONNULL) void CDNThreadManager::OnCalled(CSocketContext *pSocketContext, char *pTempBuffer, TThreadData* pThreadData) #else void CDNThreadManager::OnCalled(CSocketContext *pSocketContext, char *pTempBuffer, int nThreadID) #endif { #if defined(PRE_DEL_ONNULL) int nThreadID = pThreadData->nThreadID; #endif CSpinBuffer* pSpinBuffer = g_pIocpManager->GetSpinBuffer( nThreadID ); ScopeSpinBufferSwitch Scope( pSpinBuffer ); char* pBuffer = Scope.pGetBuffer(); UINT32 uiSize = Scope.uiGetSize(); std::vector MainCmd; std::vector SubCmd; std::vector Elapsed; std::vector AccountDBID; while( uiSize ) { memcpy( &pSocketContext, pBuffer, sizeof(CSocketContext*) ); pBuffer += sizeof(CSocketContext*); uiSize -= sizeof(CSocketContext*); if( pSocketContext == reinterpret_cast(reinterpret_cast(DNProcessCheck::Key)) ) { UINT uiTime; memcpy( &uiTime, pBuffer, sizeof(UINT) ); UINT uiCurTime = timeGetTime(); if( uiCurTime >= uiTime+DNProcessCheck::DisconnectInterval ) { // ¿©±â µé¾î¿À¸é FCBT ¶§Ã³·³ DB M/W °¡ 󸮷®À» ¸ø¹öƾ´Ù´Â°Å´Ù. Áï½Ã ¼­¹ö ³»¸®°í GG ÃÄ¾ß ÇÔ. if (g_pServiceConnection) { // timeGetTime ¿À¹öÇÃ·Î¿ì ¹ß»ý È®ÀÎ if(uiTime > (uiTime+DNProcessCheck::DisconnectInterval)) g_Log.Log( LogType::_FILELOG, L"[DB M/W][TID:%d][TIndex:%d] DB M/W Machine Not Reboot Last 49Days!!!!\n", ::GetCurrentThreadId(), nThreadID ); else { g_Log.Log( LogType::_FILELOG, L"[DB M/W Delay] ThreadID:%d ThreadIndex:%d !!!!\n", ::GetCurrentThreadId(), nThreadID ); for( UINT i=0 ; iSendRportDelayedProcess(g_pServiceConnection->GetManagedID(), DNProcessCheck::DisconnectInterval); } } } pBuffer += sizeof(UINT); uiSize -= sizeof(UINT); continue; } #if defined(PRE_ADD_HEARTBEAT_TO_SQL) else if (pSocketContext == reinterpret_cast(reinterpret_cast(DNProcessCheck::HeartbeatKey)) ) { CDNSQLMembership * pMembershipDB = g_SQLConnectionManager.FindMembershipDB(nThreadID); if (pMembershipDB) { if (pMembershipDB->QueryHeartbeat() != ERROR_NONE) _DANGER_POINT(); } CDNSQLWorld * pWorldDB; for (int i = 0; i < g_Config.nWorldDBCount; i++) { pWorldDB = g_SQLConnectionManager.FindWorldDB(nThreadID, g_Config.WorldDB[i].nWorldSetID); if (pWorldDB) { if (pWorldDB->QueryHeartbeat() != ERROR_NONE) _DANGER_POINT(); } } continue; } #endif DNTPacket* pHeader = reinterpret_cast(pBuffer); #if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR ) CScopeInterlocked Scope( &pSocketContext->m_lActiveCount ); if( Scope.bIsDelete() ) { pBuffer += pHeader->iLen; uiSize -= pHeader->iLen; continue; } #endif // #if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR ) MainCmd.push_back( pHeader->cMainCmd ); SubCmd.push_back( pHeader->cSubCmd ); TQHeader* pTempHeader = (TQHeader*)pHeader->buf; AccountDBID.push_back( pTempHeader->nAccountDBID); DWORD dwCur = timeGetTime(); CConnection* pCon = static_cast(pSocketContext->GetParam()); if( pCon ) { pCon->DBMessageProcess( pBuffer, nThreadID ); } Elapsed.push_back( timeGetTime()-dwCur ); pBuffer += pHeader->iLen; uiSize -= pHeader->iLen; if( pCon ) { long lRet = InterlockedExchangeAdd( &(static_cast(pCon)->m_lDBQueueRemainSize), -pHeader->iLen ); if( pCon->GetDelete() && lRet <= pHeader->iLen ) { #if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR ) #else delete pCon; //delete pSocketContext; #endif // #if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR ) } } else { _DANGER_POINT(); } } }