/****************************************************************************
				rc_balanced shared memory info header 
				-----------------------------------------

	begin      : 2019/03/26
	copyright  : (C) 2005 Solbox Inc.
	author     : huibong
	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 __SHM_INFO_THREAD_H__
#define __SHM_INFO_THREAD_H__


#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <list>
#include <string>


// CShmInfoThread class
// - rc_mond 공유 메모리에 접근하여....
// - 주기적으로 rebalance 처리할 FHS 정보를 조회하여 저장
// - 주기적으로 Copy 수신 가능한 FHS 정보를 조회하여 저장
// - 작업 처리 관련 각 모듈에서 필요한 정보 제공을 위한 인터페이스 제공 목적
class CShmInfoThread
{
	public:

		// 생성자
		CShmInfoThread();

		// 소멸자
		~CShmInfoThread();


		// Thread 를 생성하여 주기적으로 job 을 처리
		bool Start( void );

		// Rebalance 대상 FHS 정보를 반환
		bool GetRebalanceTargetFhs( std::string & szResultHost, std::list<std::string> & listIgnoreFHS );

		// copy content 를 저장할 target FHS 정보를 반환
		int GetCopyTargetFhs( std::string & szResultHost, std::list<std::string> & listIgnoreFHS );
	
		// Copy receive target FHS 정보가 유효한지 check 하기 위한 함수.
		bool IsValidCopyTargetFhs( void );




	private:

		// Thread handle
		pthread_t m_threadHandle;

		// Thread loop 마다 sleep time 처리 관련 변수
		unsigned int m_uSleep;

		std::list<std::string> m_listRebalanceFhs;		// Rebalance 대상 FHS 정보를 저장할 list
		struct timespec m_timeLastRefreshRebalanceFhs;	// m_listRebalanceFhs 의 마지막 refresh 시간 정보를 저장할 변수
		pthread_mutex_t m_mutexRebalanceFhs;			// m_listRebalanceFhs 관련 lock 객체


		std::list<std::string> m_listCopyTargetFhs;		// Copy 수신 처리 가능 FHS 정보를 저장할 list
		struct timespec m_timeLastRefreshCopyTargetFhs; // m_listCopyTargetFhs 의 마지막 refresh 시간 정보를 저장할 변수
		pthread_mutex_t m_mutexCopyTargetFhs;			// m_listCopyTargetFhs 관련 lock 객체


	private:

		// Thread loop base function
		static void * threadFunc( void *arg );

		// 실제 정보 갱신을 처리하는 함수
		void Execute( void );


		// rc_mond 공유메모리에서 rebalance 대상 및 Copy 수신 대상 FHS 목록을 갱신 처리하는 함수
		bool RefreshFhsList( const struct RcInfo * const pShm );

		// rc_mond 공유메모리에서 Copy 처리 수신 가능 FHS 목록을 갱신 처리하는 함수
		// - 전달받은 Storage Max usge 값 미만인 FHS 만 선정.
		bool RefreshCopyTargetFhsList( const struct RcInfo * const pShm, unsigned int uStorageMaxUsage );

		// rc_mond 공유메모리에서 rebalance 대상 FHS 목록을 갱신 처리하는 함수
		// - 전달받은 Storage Min usge 값 이상인 FHS 만 선정.
		bool RefreshRebalanceFhsList( const struct RcInfo * const pShm, unsigned int uStorageMinUsage );

};

#endif /* __SHM_INFO_THREAD_H__ */

