/****************************************************************************
                shared memory date management class
                -----------------------------------------

    begin      : 2015/06/15
    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 __SHM_MANAGER_H__
#define __SHM_MANAGER_H__

#include "ShmDefine.h"
#include "ProtocolVmasd.h"
#include "ProtocolGms.h"

#include <string>
#include <map>
#include <vector>


// 공유메모리에서 각 FHS 의 서비스 상태 정보 조회시 사용하기 위한 구조체
// - interface 함수에서 사용하기 위해 정의함.
struct FhsServiceStatInfo {

	char   hostname[HOST_NAME_LENGTH + 1];       // hostname, NULL 포함 최대 64자까지만 허용됨.
	int    service_stat;                         // Service 상태 code.
};

// 공유메모리에 저장된 각 FHS 정보 중 Write 가 가능한 FHS 정보를 추출하여 저장하기 위한 구조체
// - Top FHS 선택 모듈에 FHS 정보를 추출하여 전달하기 위해 정의함.
struct WritableFhsInfo {

	char     hostname[HOST_NAME_LENGTH + 1];       // hostname, NULL 포함 최대 64자까지만 허용됨.
	double   score;                                // Write 관련 시스템 모니터링 항목을 이용하여 계산된 score, 작을수록 idle
};


// 공유메모리 영역 전체에 대한 접근 처리 관련 인터페이스를 제공하기 위한 클래스
class CShmManager
{

	private:
		
		// 공유메모리에 대한 포인터
		struct RcInfo * const m_pShm;				

	public:

		// 생성자
		CShmManager( struct RcInfo * p );

		// 소멸자
		~CShmManager();


	public:

		// 함수 선언시 const 구문 사용 이유
		// - 멤버변수인 m_pShm 값이 변경될 경우...엉뚱한 메모리 영역을 참조하는 불상사 발생.
		// - 따라서 코딩시 m_pShm 값이 변경되지 않음을 선언하여....
	    // - 컴파일시 문제가 없는지 확인하기 위한 목적으로 사용함.
	    // - map 관련 멤버 변수 사용으로 인해.. 일부 함수에서는 사용하지 못함.
	

		// 멤버 변수인 공유메모리에 대한 포인터가 유효하지 여부를 판단하기 위한 함수.
		// return 유효한 경우 true, NULL 인 경우 false
		bool IsValid( void ) const;

		// 공유메모리 전체 영역을 초기화하기 위한 함수.
		// return
		void ClearAll( void ) const;

		// 공유메모리 상의 Client index 을 할당
		// - 전달 받은 IP 정보를 기반으로 이미 존재하는 경우.. 해당 index 반환.
		// - 존재하지 않는 경우.. 적합한 index 정보를 할당하여 전달 처리.
		// return 오류 발생시 -1, 그 외 client index
		// 본 함수는 업무 flow 상 동시 call을 하지 않아.. lock 을 사용하지 않음.
		// - 만약 동시 call 할 경우.. lock 기능 추가 필요.
		int AllocateClientIndex( const char * pClientAddress ) const;

		// 공유메모리 상의 Client index 조회
		// - 전달 받은 IP 정보를 기반으로 이미 존재하는 경우.. 해당 index 반환.
		// - 존재하지 않을 경우.. -1 반환.
		// return 오류 발생시 -1, 그 외 client index
		// 본 함수는 업무 flow 상 동시 call을 하지 않아.. lock 을 사용하지 않음.
		// - 만약 동시 call 할 경우.. lock 기능 추가 필요.
		int FindClientIndex( const char * pClientAddress ) const;

		
		// 공유메모리 상의 Client index 해제 처리.
		void ReleaseClientIndex( int index ) const;

		// 공유메모리 상의 Client Max index 를 다시 조사하여 설정 처리.
		void UpdateClientMaxIndex( void ) const;


		// 공유메모리 상의 Client index 에 해당하는 client 영역을 반환.
		struct ClientInfo * GetClientPtr( int index ) const;
		
		// vmasd 에서 받은 정보를 공유메모리에 저장 처리
		// - 실제 오류 상황인 경우에만.. false 반환.
		// - 그외 이미 존재하는 상황 등인 경우에는 정상 처리된 것으로 반환 처리한다.
		// return false 
		bool SetVmasdData( struct vmasd_broadcast_message_body * pBody ) const;

		// Alive (상태가 OK, Read-only) 인 FHS 목록 정보 조회 요청 
		// param vecResult [out] 추출된 alive fhs 목록을 저장하기 위한 vector 참조.
		// return 목록 갯수
		int GetAliveFhsList( std::vector<struct FhsServiceStatInfo> & vecResult ) const;


		// 공유메모리에 저장된 client 정보 중 갱신되지 않는 오래된 client 정보를 정리한다.
		// param expireTime [in] 공유메모리 update_time_clock_sec 정보와 expire 처리 여부를 비교하기 위한 기준값.
		// return expire 처리된 client 수.
		int ExpireClient( time_t expireTime ) const;


		// GMS 로 전송할 RC 상태 정보 요청 
		// param vecResult [out] 추출된 목록을 저장하기 위한 vector 참조.
		// return 목록 갯수
		int GetGmsSendList( std::vector<struct PacketDataGms> & vecResult ) const;
		

		// Top FHS 정보 추출
		// param vecResult [out] 추출된 목록을 저장하기 위한 vector 참조.
		// param dDiskMaxBusyWeight [in] score 항목 계산시 disk_max_busy 정보에 대한 가중치값.
		// return 목록 갯수
		int GetWritableFhsList( std::vector<struct WritableFhsInfo> & vecResult, double dDiskMaxBusyWeight ) const;

};


#endif /* __SHM_MANAGER_H__ */

