#pragma once

#include <string>
#include <map>

#include <assert.h>

/*!
 * ロックオブジェクト
 */
class LockObject
{
private:
	bool owner_;

	CRITICAL_SECTION *pCriticalSect_;

	LockObject& operator=(const LockObject&); //<! 実装なし

	LockObject(const LockObject& src); //<! 実装なし

public:
	/*!
	 * 構築した時点でロックをかける。
	 */
	LockObject(CRITICAL_SECTION *pCriticalSect);

	/*!
	 * まだロック解除されてなければ解除する。
	 */
	~LockObject();

	/*!
	 * まだロック解除されてなければ解除する。
	 */
	void Release() throw();
};

/**
 * ロックマネージャ
 */
class LockManager
{
private:
	CRITICAL_SECTION criticalSect_;

	typedef std::map<tstring, CRITICAL_SECTION*> critical_section_map;

	critical_section_map criticalSections_;

	LockManager(const LockManager&); //<! 実装なし

	LockManager& operator=(const LockManager&); //<! 実装なし

public:
	LockManager();

	virtual ~LockManager();

	/*!
	 * ロックオブジェクトを取得する。
	 * 取得した時点で、そのスレッドが固有のロックを取得する。
	 * 明示的にリリースするか、破棄されたときに解除される。
	 */
	virtual LockObject *GetLockObject(const tstring& name);

	/*!
	 * 現在、ロックされていないロックオブジェクトを未使用とみなして
	 * すべて削除する。
	 */
	virtual void RemoveUnusedLock();

};
