1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: os_LockPolicy.h 4 5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 12449 $ 14 *---------------------------------------------------------------------------*/ 15 16 17 #ifndef NN_OS_OS_LOCKPOLICY_H_ 18 #define NN_OS_OS_LOCKPOLICY_H_ 19 20 #ifdef __cplusplus 21 22 #include <nn/Result.h> 23 #include <nn/WithInitialize.h> 24 25 namespace nn { namespace os { 26 27 /*! 28 @brief ロックポリシーをまとめたコンテナクラス 29 */ 30 struct LockPolicy { 31 32 /*! 33 @brief ロックをしないポリシーを表すポリシークラス 34 */ 35 struct NoLock 36 { 37 class LockObject 38 { 39 public: InitializeLockPolicy::NoLock40 void Initialize() {} TryInitializeLockPolicy::NoLock41 nn::Result TryInitialize() { return ResultSuccess(); } FinalizeLockPolicy::NoLock42 void Finalize() {} 43 }; 44 45 class ScopedLock 46 { 47 public: ScopedLockLockPolicy::NoLock48 ScopedLock(const LockObject&) {} ~ScopedLockLockPolicy::NoLock49 ~ScopedLock() {} 50 }; 51 }; 52 53 /*! 54 @brief 個々のオブジェクトに対して用意されたロック機構を使ってロックすることを表すポリシークラス 55 56 @tparam Locker ロックに用いるオブジェクトの型を指定します。@ref nn::os::Mutex もしくは @ref nn::os::CriticalSection を指定できます。 57 58 LockPolicy に @ref nn::os::Mutex と @ref nn::os::CriticalSection 以外を指定した場合の動作・互換性は保障されません。 59 */ 60 template <class Locker> 61 struct Object 62 { 63 class ScopedLock; 64 65 class LockObject 66 { 67 friend class ScopedLock; 68 mutable Locker mutex; 69 public: InitializeLockPolicy::Object70 void Initialize() { mutex.Initialize(); } TryInitializeLockPolicy::Object71 nn::Result TryInitialize() { return mutex.TryInitialize(); } FinalizeLockPolicy::Object72 void Finalize() { mutex.Finalize(); } 73 }; 74 75 class ScopedLock : private Locker::ScopedLock 76 { 77 public: ScopedLockLockPolicy::Object78 ScopedLock(const LockObject& obj) : Locker::ScopedLock(obj.mutex) {} 79 }; 80 }; 81 82 83 /*! 84 @brief グローバルに一つだけ用意されたロック機構を使ってロックすることを表すポリシークラス 85 86 @tparam Locker ロックに用いるオブジェクトの型を指定します。@ref nn::os::Mutex もしくは @ref nn::os::CriticalSection を指定できます。 87 88 LockPolicy に @ref nn::os::Mutex と @ref nn::os::CriticalSection 以外を指定した場合の動作・互換性は保障されません。 89 */ 90 template <class Locker> 91 struct Global 92 { 93 private: 94 static Locker g_Mutex; 95 public: 96 class LockObject 97 { 98 public: InitializeLockPolicy::Global99 void Initialize() {} TryInitializeLockPolicy::Global100 nn::Result TryInitialize() { return ResultSuccess(); } FinalizeLockPolicy::Global101 void Finalize() {} 102 }; 103 104 class ScopedLock : private Locker::ScopedLock 105 { 106 public: ScopedLockLockPolicy::Global107 ScopedLock(const LockObject&) : Locker::ScopedLock(g_Mutex) {} 108 }; 109 }; 110 111 }; 112 113 template <class Locker> Locker LockPolicy::Global<Locker>::g_Mutex = nn::WithInitialize(); 114 115 }} 116 117 #endif 118 119 #endif 120