/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
/*																				*/
/*	CLSSharedMemory			共有メモリクラス									*/
/*																				*/
/*	共有メモリの操作を簡易化すると同時に共有メモリに関するWindows/UNIX間の		*/
/*	APIの差異を吸収し操作の統一化を計る											*/
/*																				*/
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

#ifndef	__SHAREDMEMORY_CLS_H
#define	__SHAREDMEMORY_CLS_H

//_/_/_/_/_/_/_/_/_/_/_//
//						/
//	include/定数定義	/
//						/
//_//_/_/_/_/_/_/_/_/_/_//

#include <stdio.h>
#include <string.h>
#include "GG_DEF.h"

#ifdef WIN32

#include <windows.h>

typedef int key_t;

#else

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>

#endif

class CLSSharedMemory {
	private:
#ifdef WIN32
		HANDLE	hSharedMemory;			//共有メモリハンドル
		HANDLE	hLockMutex;				//共有メモリ書き込みロック用ミューテックスハンドル
#else
		int		iSharedMemory;			//共有共有メモリハンドル
		int		iLockMutex;				//共有メモリ書き込みロック用ミューテックスハンドル
#endif
		key_t	keySharedMemoryID;		//共有メモリID
		key_t	keyLockMutexID;			//ロック用ミューテックスID

		long	lSize;					//共有メモリサイズ
		void *	pData;					//共有メモリ
		BOOL	blMutexFlg;				//ミューテックスロック中かどうかのチェックフラグ
		
		int		iErrorNo;				//errno
		char	cErrorMsg[256];			//Errメッセージ
		
	public:

		//コンストラクタ
		CLSSharedMemory(){
#ifdef WIN32
			hSharedMemory     = NULL;
			hLockMutex        = NULL;
#else
			iSharedMemory     = 0;
			iLockMutex        = 0;
#endif
			pData             = NULL;
			lSize             = 0;
			keySharedMemoryID = 0;
			keyLockMutexID    = 0;
			blMutexFlg        = FALSE;
			iErrorNo          = 0;
			*(cErrorMsg)      = '\0';
		}
		//デストラクタ
		~CLSSharedMemory();
		//共有メモリオープンチェック
		BOOL	checkSharedMemory();
		//
		BOOL	SetSharedMemoryID(key_t inputSharedMemoryID);
		BOOL	SetLockMutexID(key_t inputLockMutexID);
		void *	CreateSheredMemory(long memSize);
		void *	CreateSheredMemory(key_t inputSharedMemoryID,long memSize);
		void *	OpenSheredMemory();
		void *	OpenSheredMemory(key_t inputSharedMemoryID);
		void *	OpenWriteSheredMemory();
		void *	OpenWriteSheredMemory(key_t inputSharedMemoryID);
		void	CloseSheredMemory();
		BOOL	WriteSheredMemoryStart();
		BOOL	WriteSheredMemoryEnd();
		BOOL	WriteSheredMemoryCheck();
		int		getErrorNo(){ return iErrorNo; }
		const char *	getErrorMsg(){ return cErrorMsg; }
#ifndef WIN32
		int		getSharedMemory(){ return iSharedMemory;}
#else
		int		getSharedMemory(){ return 0;}
#endif
};

#endif

