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 /* Please see man pages for details 28 29 */ 30 struct LockPolicy { 31 32 /* Please see man pages for details 33 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 /* Please see man pages for details 54 55 56 57 58 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 /* Please see man pages for details 84 85 86 87 88 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