#include "stdafx.h" #include #include #include #include #include "MasterServerEx.h" //================================================================================================== // @desc ¸Þ¸ð¸® ´©¼ö ¸®Æ÷ÅÍ »ç¿ë ¿©ºÎ #define MEMORY_LEAK_REPORT_FILE "memory_leak_Master.txt" // @desc °øÀ¯µÈ ¸Þ¸ð¸® ´©¼ö Ãâ·Â ÆÄÀϸí #define MEMORY_LEAK_REPORT_FILE_FOR_SHARED "./memory_leak_Master_shared.txt" #include "./SharedMemoryLeakReporter.hxx" //================================================================================================== // // //============================================================ // extern "C" { int WinMainCRTStartup(); } int SunEntryPoint() { SharedMemoryPool::CreateInstance(); return WinMainCRTStartup(); } //============================================================ // Module Varialbes static MasterServerEx* s_pMasterServerEx = NULL; // Global SolarSimpleConsole g_Console; MasterServerEx* MasterServerEx::GetMainFrame() { return s_pMasterServerEx; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SolarDump dp; // ÄܼÖâ ÃʱâÈ­ CONSOLE_DESC cdesc; ZeroMemory( &cdesc, sizeof(cdesc) ); cdesc.bUsingConsoleInput = FALSE; cdesc.bUsingRedirect = TRUE; g_Console.Init( &cdesc ); // ¸í·É Àμö ÆÄ½Ì if( !ParseArguments( (LPTSTR)lpCmdLine ) ) { DISPMSG( "ÎÞЧ²ÎÊý!\n" ); system( "pause" ); return 0; } DISPMSG( \ "=============================================================================\n" \ " ¿ªÊ¼³õʼ»¯ Master ·þÎñ!\n" \ "=============================================================================\n"); // ¼­¹ö ÃʱâÈ­ s_pMasterServerEx = new MasterServerEx(); if( !s_pMasterServerEx->DoInit( "./MasterServer.ini", MasterServerEx::CreateServerSideAcceptedObject, MasterServerEx::DestroyServerSideAcceptedObject, MasterServerEx::DestroyServerSideConnectedObject, MasterServerEx::CreateServerSideAcceptedObject, MasterServerEx::DestroyServerSideAcceptedObject, MasterServerEx::DestroyServerSideConnectedObject /*NULL, NULL, NULL*/ ) ) { DISPMSG( "[WinMain] ·þÎñ³õʼ»¯Ê§°Ü!\n" ); system( "pause" ); return 0; } MessageOut( eFULL_LOG, "============================================================================= " ); MessageOut( eFULL_LOG, " SUN Online Master ³õʼ»¯Íê³É." ); MessageOut( eFULL_LOG, "============================================================================= " ); // // s_pMasterServerEx->DoProcess(); s_pMasterServerEx->DoRelease(); // ServerFrameÀ» »ó¼ÓÇϸ鼭 »ý±ä¹®Á¦ ÇØ°á ¸ñÀû // ReleaseÀÌÈÄÀÇ »õ·Î¿î Instance ¸¦ »ý¼ºÇÏ´Â °ÍµéÀº µû·Î ¿©±â¼­ ÇØÁ¦Çϱâ·Î ÇÑ´Ù. s_pMasterServerEx->Finalize(); SAFE_DELETE(s_pMasterServerEx); // ¼­¹ö Á¾·á DISPMSG( "[WinMain] ·þÎñÆ÷ÒÑÖÕÖ¹...\n" ); // ÄܼÖâ Á¾·á g_Console.Release(); return 0; } // // // ServerSession* MasterServerEx::Handler_AllocServerSession( eSERVER_TYPE serverType ) { ServerSession* pServerSession = (ServerSession*)Handler_AllocServerSession_NoInit( serverType ); if( pServerSession ) { pServerSession->Init( s_pMasterServerEx ); } return pServerSession; } VOID MasterServerEx::Handler_FreeServerSession( ServerSession* pServerSession ) { if( pServerSession ) { pServerSession->Release(); Handler_FreeServerSession_NoRelease( pServerSession ); } } NetworkObject* MasterServerEx::Handler_AllocServerSession_NoInit( eSERVER_TYPE serverType ) { NetworkObject* pSession = (NetworkObject*)ServerSessionManager::AllocNewSession( serverType ); if( !pSession ) { MessageOut( eCRITICAL_LOG, "[ServerSessionFactory::AllocServerSession] À߸øµÈ ¼­¹ö ŸÀÔÀÌ´Ù. Ç®¿¡¼­ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù." ); } return pSession; } VOID MasterServerEx::Handler_FreeServerSession_NoRelease( NetworkObject* pNetworkObject ) { if( !pNetworkObject ) { MessageOut( eCRITICAL_LOG, "NULL·Î ServerSession ÇØÁ¦ÇÏ·Á°í ÇÑ´Ù." ); return; } ServerSession* pServerSession = (ServerSession*)pNetworkObject; if( !ServerSessionManager::FreeSession( pServerSession ) ) { MessageOut( eFULL_LOG, "[ServerSessionFactory::FreeServerSession] À߸øµÈ ŸÀÔÀÇ ¼­¹ö¼¼¼ÇÀ» FreeÇÒ ¼ö ¾ø´Ù" ); } } ///------------------------------------------------------------------------------------------------ /// ¼­¹öÂÊ Äݹé NetworkObject* MasterServerEx::CreateServerSideAcceptedObject() { ServerSessionEx* pServerSession = (ServerSessionEx*)MasterServerEx::Handler_AllocServerSession_NoInit( TEMP_SERVER ); ((ServerSession*)pServerSession)->Init( s_pMasterServerEx ); return (NetworkObject*)pServerSession; } VOID MasterServerEx::DestroyServerSideAcceptedObject( NetworkObject* pNetworkObject ) { MasterServerEx::Handler_FreeServerSession( (ServerSession*)pNetworkObject ); } VOID MasterServerEx::DestroyServerSideConnectedObject( NetworkObject* pNetworkObject ) { __UNUSED(pNetworkObject); }