
#ifndef _dkutil_user_config
#define _dkutil_user_config



#ifdef USE_DKINGYO_INCLUDE_SETTING_LIKE_BOOST
#	include <dkutil/dkutilCriticalSection.h>
#else
#	if DKUTIL_COMPILE_OPTION_MSVC
#		include "../dkutilCriticalSection.h"
#	else
#		include "dkutilCriticalSection.h"
#	endif
#endif



namespace dkutil{

//**********************************************************
//ライブラリのリンク設定
//**********************************************************

///メルセンヌツイスター SSE2版のライブラリへのパス
#define DKUTIL_MYMT_PATH "mymt"

///zlibへのパス
#define DKUTIL_ZLIB_PATH "zlib_dk"
///マルチスレッド版ZLIB
#define DKUTIL_ZLIB_PATH_MT "zlib_dkMT"
///libpngへのパス
#define DKUTIL_LIBPNG_PATH "libpng_dk"
///マルチスレッド版LIBPNG
#define DKUTIL_LIBPNG_PATH_MT "libpng_dkMT"

///OggVorbisSDKへのパス
#define DKUTIL_OGG_STATIC_PATH "ogg_static"

#define DKUTIL_VORBIS_STATIC_PATH "vorbis_static"

#define DKUTIL_VORBISFILE_STATIC_PATH "vorbisfile_static"

#define DKUTIL_VORBISENC_STATIC_PATH "vorbisenc_static"

///yaneSDKへのパス
#ifdef _DEBUG
#	define DKUTIL_YANESDK3RD_PATH "yaneSDK_d"
#else//release build
#	define DKUTIL_YANESDK3RD_PATH "yaneSDK"
#endif


//**********************************************************
	//Config系のものを定義してください。(デフォルトではこのままでOKです。
//**********************************************************

///dkutil::singleton等を見ると、使い方が分かると思います。
struct DKConfigUtility{
protected:
	//変数は申し訳ありませんが、このクラス内に宣言しないでください。
public:
	DKConfigUtility(){}
	virtual ~DKConfigUtility(){}

	inline void LockThread(){
		private_::GetCriticalSection().Enter();
	}
	inline void UnlockThread(){
		private_::GetCriticalSection().Leave();
	}
	//inline void LockThreadSyndrome(){}
	//inline void UnlockThreadSyndrome(){}
};

//**********************************************************
//マルチスレッドの設定
//**********************************************************


//マルチスレッドなら
#ifdef _MT //マルチスレッドでビルドする

#	define DKUTIL_LOCKTHREAD(u) try{ u.LockThread()
#	define DKUTIL_UNLOCKTHREAD(u) }catch(...){u.UnlockThread();throw;}u.UnlockThread()
#	define DKUTIL_MULTITHREAD_SYNDROME_LOCK(u)
#	define DKUTIL_MULTITHREAD_SYNDROME_UNLOCK(u)

#	ifdef USE_DKINGYO_MULTITHREAD_CHECKER //マルチスレッドチェッカーを使う

//かなり安全なマルチスレッド処理を行うためにロックしなくてもいいかな？
//って場所にもロックする。例えば、とあるオブジェクト(クラス)をグローバルにして
//スレッド間でそれにアクセスできる場合などは以下のマクロを使えるようにしなければならない。
//なのでdkutilConfig.hでUSE_DKINGYO_MULTITHREAD_CHECKERを有効にする必要がある。

#		undef	DKUTIL_MULTITHREAD_SYNDROME_LOCK
#		undef	DKUTIL_MULTITHREAD_SYNDROME_UNLOCK
#		define DKUTIL_MULTITHREAD_SYNDROME_LOCK(u)  DKUTIL_LOCKTHREAD(u)
#		define DKUTIL_MULTITHREAD_SYNDROME_UNLOCK(u) DKUTIL_UNLOCKTHREAD(u)
#	endif

#else // シングルスレッドなら

#	define DKUTIL_LOCKTHREAD(u) ((void)0)
#	define DKUTIL_UNLOCKTHREAD(u) ((void)0)
#	define DKUTIL_MULTITHREAD_SYNDROME_LOCK(u) ((void)0)
#	define DKUTIL_MULTITHREAD_SYNDROME_UNLOCK(u) ((void)0)

#endif

}//end of dkutil namespace



//**********************************************************
//ライブラリのリンクを反映
//**********************************************************
#ifdef _MSC_VER
#pragma comment(lib, DKUTIL_MYMT_PATH )
#endif



#endif //end of include once