////////////////////////////////////////////////////////////////////////////
// CLock クラスのインタフェース宣言
//
// 共有ロック及び占有ロックの管理を行う。
////////////////////////////////////////////////////////////////////////////

#if !defined( LOCK_H_INCLUDED_ )
#define LOCK_H_INCLUDED_

#include "Semaphore.h"
#include <map>

typedef unsigned long LOCK_ID;

class CLock
{
protected:
	// ロックの種類を示す定数
	enum LOCKTYPE {
		LT_OCCUPATION,
		LT_SHARE
	};
public:
	CLock();
	~CLock();

	LOCK_ID TryOccupationLock();	// 占有ロックを試みる
	LOCK_ID TryShareLock();		// 共有ロックを試みる
	LOCK_ID WaitOccupationLock();	// 占有ロックするまで待ち合わせる
	LOCK_ID WaitShareLock();	// 共有ロックするまで待ち合わせる

	void Free( LOCK_ID id );	// ロックを解放する

	bool CheckOccupationLock( LOCK_ID id ) const;	// 指定されたIDで占有ロックされているか否か
	bool CheckShareLock( LOCK_ID id ) const;	// 指定されたIDで共有ロックされているか否か

protected:
	// IDを発番する
	LOCK_ID CreateID( LOCKTYPE type );


	CSemaphore sema_Occupation;	// 占有ロックのセマフォ
	CSemaphore sema_Share;		// 共有ロックのセマフォ

	std::map< LOCK_ID, LOCKTYPE > mapLockNumber;	// ロックの番号を保持する
	unsigned long ShareLockCount;	// 共有ロックのカウンタ
	LOCK_ID counter;	// 降り出すIDのカウンタ

	mutable CSemaphore sema_id;	// ID管理用のセマフォ
};

#endif // LOCK_H_INCLUDED_

