/****************************************************************************
				rc_balanced process monitoring thread header 
				-----------------------------------------

	begin      : 2019/03/07
	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 __PROCESS_MONITORING_THREAD_H__
#define __PROCESS_MONITORING_THREAD_H__

#include "RebalanceData.h"
#include "DataQueue.hpp"
#include "CopyControlThread.h"

#include <pthread.h>

#include <map>
#include <string>




// 각 FHS 별 unlink 처리한 정보 저장을 위한 구조체
// map 을 통해서 관리하기 때문에 각 장비 hostname 을 정보에 포함시키지 않는다.
struct FhsUnlinkInfo {

	unsigned long long	hour_sum;		// 시간당 삭제 sum
	unsigned long       hour_count;		// 시간당 삭제 count

	unsigned long long	day_sum;		// 일일	삭제 sum
	unsigned long		day_count;		// 일일 삭제 count
};



// CProcessMonitoringThread class
// - 프로세스 내부의 각 작업 queue count 정보를 주기적으로 console 상에 업데이트 처리
// - 주기적으로 rebalance 처리 상황을 로깅
class CProcessMonitoringThread
{
	
	public:

		// 생성자
		CProcessMonitoringThread(
			CDataQueue<CRebalanceData> * const pQueueMoveStandby
			, CDataQueue<CRebalanceData> * const pQueueUpdateStandby
			, CDataQueue<CRebalanceData> * const pQueueDeleteStandby 
			, CCopyControlThread * const pCopyControlThread
		);

		// 소멸자
		~CProcessMonitoringThread();


		// Thread 를 생성하여 상태정보를 주기적으로 갱신, 로깅 처리한다.
		bool Start( void );

		// 현재 프로세스 표시 정보 직접 업데이트
		void UpdateTitle( void );

		// PhysicalDeleteThread 모듈로 부터 정상적으로 삭제한 FHS, content 정보를 전달받기 위한 함수
		// - 전달받은 정보는 내부적으로 저장했다가 주기적으로 logging 처리
		void UpdateDeletedInfo( CRebalanceData & data );



	private:

		// Thread Handle
		pthread_t m_threadHandle;

		// Move 처리할 대상을 저장하는 queueMoveStandby 객체에 대한 포인터
		CDataQueue<CRebalanceData> * m_pQueueMoveStandby;

		// FHS Copy 처리 완료 후 RCDB 업데이트 대상 content 정보를 저장하는 queueUpdateStandby 객체에 대한 포인터
		CDataQueue<CRebalanceData> * m_pQueueUpdateStandby;

		// unlink 처리 대상 content 정보를 저장하는 queueDeleteStandby 객체에 대한 포인터
		CDataQueue<CRebalanceData> * m_pQueueDeleteStandby;

		// copy control thread 객체에 대한 포인터
		CCopyControlThread * m_pCopyControlThread;

		// unlink 처리한 FHS 별 통계 정보 저장을 위한 객체
		std::map<std::string, struct FhsUnlinkInfo> m_mapUnlinkInfo;
		pthread_mutex_t m_mutexUnlinkInfo;


	private:

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

		// 실제 상태 정보 업데이트를 수행하는 함수
		void Execute( void );

		// FHS 별 삭제 처리한 통계 정보를 로깅 및 초기화 처리한다.
		void printUnlinkInfo( void );



};

#endif /* __PROCESS_MONITORING_THREAD_H__ */
