/****************************************************************************
                Alive FHS list cache thread class
                -----------------------------------------

    begin      : 2015/07/17
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
    email      : huibong@solbox.com
    version    : 3.5

    CopyRight(C) 2005 Solbox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of Solbox Inc.
*****************************************************************************/

#ifndef __ALIVE_FHS_CACHE_THREAD_H__
#define __ALIVE_FHS_CACHE_THREAD_H__


#include "ShmDefine.h"
#include "ShmManager.h"

#include <pthread.h>
#include <unistd.h>
#include <stdint.h>

#include <vector>


// 공유메모리 상에서 Alive FHS 정보를 주기적으로 조회하여 저장하고...
// interface 함수를 통해 해당 정보를 전달 처리하기 위한 Thread Class.
class CAliveFhsCacheThread
{

	public:

		// 생성 및 소멸자.
		CAliveFhsCacheThread( CShmManager * pShmManager );
		~CAliveFhsCacheThread();

		// Thread 를 생성하여 cache 작업 수행
		bool Start( void );

		// Alive FHS 목록 제공을 위한 interface 함수.
		// param   vecResult [out] alive fhs 결과 정보를 저장하기 위한 변수.
		// return  -1   : FHS 정보가 아직 불안전하니 SKIP 처리하라는 의미
		//        그 외 : alive fhs 갯수.
		int GetAliveFhs( std::vector<struct FhsServiceStatInfo> & vecResult );

		
	private:

		// 공유메모리에서 Alive FHS 목록 추출시 사용할 공유메모리 inferface 객체 (생성자를 통해 전달받음)
		CShmManager * m_pShmManager;
		
		// 쓰레드 핸들
        pthread_t m_threadHandle;


		// Thread 기동 후 지정된 시간 동안 공유메모리 FHS 정보가 완전하지 않아.. SKIP 하라는 flag 
		bool m_bResultSkip;

		// Alive FHS 목록을 저장할 Vector 객체
		// - struct FhsServiceStatInfo 는 ShmManager.h 에 정의되어 있음.
		// - 2개의 list 를 이용하여 목록을 교차하여 갱신처리.
		std::vector<struct FhsServiceStatInfo> m_vecAliveFhs1;
		std::vector<struct FhsServiceStatInfo> m_vecAliveFhs2;

		// lock 처리를 최소화하기 위해 포인터를 이용하여 구현.
		std::vector<struct FhsServiceStatInfo> * m_pCurrent;
		std::vector<struct FhsServiceStatInfo> * m_pOld;
		std::vector<struct FhsServiceStatInfo> * m_pTemp;
		
	private:

		// Thread function....
		static void * threadFunc( void * arg );

		// 실제 cache 처리를 담당하는 함수.
		void Execute( void );

};


#endif /* __ALIVE_FHS_CACHE_THREAD_H__ */

