#include "AliveFhsCacheThread.h" #include "Logger.h" #include #include // alive fhs Á¤º¸ÀÇ cache °»½Å ÁÖ±â ( sec ) #define ALIVE_FHS_CACHE_INTERVAL 1 // °øÀ¯¸Þ¸ð¸® FHS Á¤º¸°¡ ±âµ¿Ãʱ⠿ÏÀüÇÏÁö ¾Ê¾Æ... // ÁöÁ¤µÈ ½Ã°£(sec) µ¿¾È skip ó¸® Çϱâ À§ÇÑ define. #define ALIVE_FHS_SKIP_TIME 6 // »ý¼ºÀÚ CAliveFhsCacheThread::CAliveFhsCacheThread( CShmManager * pShmManager ) : m_pShmManager( pShmManager ) { // Thread handle ÃʱâÈ­ m_threadHandle = 0; // vector °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ ÃʱâÈ­. m_vecAliveFhs1.clear(); m_vecAliveFhs2.clear(); m_pCurrent = &( m_vecAliveFhs1 ); m_pOld = &( m_vecAliveFhs2 ); // Skip flag ´Â ±âµ¿ Ãʱ⠼³Á¤ ó¸®. m_bResultSkip = true; } // ¼Ò¸êÀÚ CAliveFhsCacheThread::~CAliveFhsCacheThread() { // Thread °¡ µ¿ÀÛ ÁßÀÎ °æ¿ì Thread µ¿ÀÛ Á¤Áö ó¸®. if( m_threadHandle != 0 ) { pthread_cancel( m_threadHandle ); } } // Thread ¸¦ »ý¼ºÇÏ¿© cache ÀÛ¾÷ ¼öÇà bool CAliveFhsCacheThread::Start( void ) { int nResult = pthread_create( &m_threadHandle, NULL, CAliveFhsCacheThread::threadFunc, this ); if( nResult != 0 ) { // Thread »ý¼º ½ÇÆÐ½Ã... int errorNum = errno; LOG( LERR, "AliveFhsCacheThread: Thread create failed.[%d][%s]", errorNum, strerror( errorNum ) ); return false; } return true; } // Thread ÇÔ¼ö void * CAliveFhsCacheThread::threadFunc( void * arg ) { CAliveFhsCacheThread * pObject = reinterpret_cast( arg ); pthread_detach( pthread_self() ); // SKIP »óÅÂ ÇØÁö¸¦ ÆÇ´ÜÇϱâ À§ÇÑ º¯¼ö. int nSkipCount = 0; // ÁÖ±âÀûÀ¸·Î alive FHS cache °»½Å ó¸®. while( 1 ) { pthread_testcancel(); pObject->Execute(); pthread_testcancel(); // ÁöÁ¤µÈ Ƚ¼ö¸¦ ÃʰúÇϸé Skip 󸮸¦ ÇØÁ¦ÇÑ´Ù. if( pObject->m_bResultSkip == true ) { if( nSkipCount > ALIVE_FHS_SKIP_TIME ) { pObject->m_bResultSkip = false; _LOG( LINF, "AliveFhsCacheThread: alive FHS SKIP mode end. "); } else { ++nSkipCount; //_LOG( LDBG, "AliveFhsCacheThread: Alive FHS SKIP..." ); } } // ÁöÁ¤µÈ Áֱ⸶´Ù cache °»½Å. sleep( ALIVE_FHS_CACHE_INTERVAL ); } // Thread Á¾·á½Ã Handle ÃʱâÈ­ pObject->m_threadHandle = 0; return NULL; } // ½ÇÁ¦ cache 󸮸¦ ´ã´çÇÏ´Â ÇÔ¼ö. void CAliveFhsCacheThread::Execute() { // ÀÌÀü Á¤º¸¸¦ ÀúÀåÇÑ vector ÃʱâÈ­. m_pOld->clear(); // °øÀ¯¸Þ¸ð¸®·ÎºÎÅÍ Alive FHS Á¤º¸ ÀúÀå ó¸® m_pShmManager->GetAliveFhsList( *m_pOld ); // ÃֽŠAlive FHS Á¤º¸¸¦ »ç¿ëÇϵµ·Ï Æ÷ÀÎÅÍ Á¤º¸ º¯°æ ó¸®. m_pTemp = m_pCurrent; m_pCurrent = m_pOld; m_pOld = m_pTemp; // SKIP ¸ðµå°¡ ¾Æ´Ñ »óÅ¿¡¼­ Alive FHS Á¤º¸°¡ À¯È¿ÇÏÁö ¾ÊÀº °æ¿ì¸¸ ·Î±ë ó¸®. if( m_pCurrent->size() == 0 && m_bResultSkip == false ) { _LOG( LWAR, "AliveFhsCacheThread: Alive FHS not exist. [%zu]", m_pCurrent->size()); } return; } // Alive FHS ¸ñ·Ï Á¦°øÀ» À§ÇÑ interface ÇÔ¼ö. // param vecResult [out] alive fhs °á°ú Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö. // return -1 : FHS Á¤º¸°¡ ¾ÆÁ÷ ºÒ¾ÈÀüÇÏ´Ï SKIP ó¸®Ç϶ó´Â ÀÇ¹Ì // ±× ¿Ü : alive fhs °¹¼ö. int CAliveFhsCacheThread::GetAliveFhs( std::vector & vecResult ) { // skip flag °¡ ¼³Á¤µÈ °æ¿ì... if( m_bResultSkip == true ) return -1; else { // Á¤»ó »óȲÀÎ °æ¿ì... vecResult = *( m_pCurrent ); return m_pCurrent->size(); } }