1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: osl_EventFlag.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: 31897 $
14 *---------------------------------------------------------------------------*/
15
16 #ifndef NN_NET_OSL_OSL_EVENTFLAG_H_
17 #define NN_NET_OSL_OSL_EVENTFLAG_H_
18
19 #include <nn/fnd/fnd_Interlocked.h>
20 #include <nn/os/os_Event.h>
21 #include <nn/os/os_CriticalSection.h>
22
23 typedef enum
24 {
25 NN_NET_OSL_WAITMODE_AND,
26 NN_NET_OSL_WAITMODE_OR
27 } nnnetOslWaitMode;
28
29 #ifdef __cplusplus
30
31 namespace nn{ namespace net{ namespace osl{
32
33 class EventFlag
34 {
35 public:
36 enum WaitMode
37 {
38 ModeAnd = NN_NET_OSL_WAITMODE_AND,
39 ModeOr = NN_NET_OSL_WAITMODE_OR
40 };
41 static const bit32 INITIAL_ALLOCATE = 0x3;
42 static const size_t MAX_FLAG_BITS = 4;
43 static const bit32 VALID_MASK = (1 << MAX_FLAG_BITS) - 1;
44
EventFlag()45 EventFlag()
46 : m_validMap(0)
47 {
48 }
49
~EventFlag()50 ~EventFlag()
51 {
52 Finalize();
53 }
54
55 void Initialize(void);
56 Result TryInitialize(void);
57 void Finalize(void);
58
59 void Signal(bit32 pattern);
60 bit32 Wait(bit32 pattern, WaitMode mode, nn::fnd::TimeSpan timeout);
61 bit32 Wait(bit32 pattern, WaitMode mode);
62
63 bit32 WaitAndClear(bit32 pattern, WaitMode mode, bit32 clear, nn::fnd::TimeSpan timeout);
64 bit32 WaitAndClear(bit32 pattern, WaitMode mode, bit32 clear);
65
66 void ClearSignal(bit32 pattern);
67
68 protected:
69 Result AllocateEvents(bit32 bitmap);
70 void FreeEvents(bit32 bitmap);
71
InfiniteTimeSpan()72 static inline fnd::TimeSpan InfiniteTimeSpan()
73 {
74 return fnd::TimeSpan::FromNanoSeconds(NN_OS_WAIT_INFINITE);
75 }
76
77 private:
78 nn::os::CriticalSection m_cs;
79 nn::os::Event m_events[MAX_FLAG_BITS];
80 bit32 m_validMap;
81 };
82
Wait(bit32 pattern,WaitMode mode)83 inline bit32 EventFlag::Wait(bit32 pattern, WaitMode mode)
84 {
85 return Wait(pattern, mode, InfiniteTimeSpan());
86 }
87
WaitAndClear(bit32 pattern,WaitMode mode,bit32 clear)88 inline bit32 EventFlag::WaitAndClear(bit32 pattern, WaitMode mode, bit32 clear)
89 {
90 return WaitAndClear(pattern, mode, clear, InfiniteTimeSpan());
91 }
92
93 }}} // namesapce nn::net::osl
94
95 #endif // __cplusplus
96
97 // 以下、C 用宣言
98
99 #include <nn/util/detail/util_CLibImpl.h>
100
101 #define NN_NET_OSL_EVENTFLAG_SIZE (NN_OS_CRITICALSECTION_SIZE + (4 + 1) * 4)
102 #define NN_NET_OSL_EVENTFLAG_ALIGNMENT_HOLDER_TYPE u32
103
104 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnnetOslEventFlag, nn::net::osl::EventFlag, NN_NET_OSL_EVENTFLAG_SIZE, NN_NET_OSL_EVENTFLAG_ALIGNMENT_HOLDER_TYPE);
105
106 NN_EXTERN_C void nnnetOslEventFlagInitialize(nnnetOslEventFlag* this_);
107 NN_EXTERN_C bool nnnetOslEventFlagTryInitialize(nnnetOslEventFlag* this_);
108 NN_EXTERN_C void nnnetOslEventFlagSignal(nnnetOslEventFlag* this_, bit32 pattern);
109 NN_EXTERN_C bit32 nnnetOslEventFlagWaitSignal(nnnetOslEventFlag* this_, bit32 pattern, nnnetOslWaitMode mode, s64 timeout);
110 NN_EXTERN_C void nnnetOslEventFlagClearSignal(nnnetOslEventFlag* this_, bit32 pattern);
111 NN_EXTERN_C bit32 nnnetOslEventFlagWaitAndClear(nnnetOslEventFlag* this_, bit32 pattern, nnnetOslWaitMode mode, bit32 clear, s64 timeout);
112 NN_EXTERN_C void nnnetOslEventFlagFinalize(nnnetOslEventFlag* this_);
113
114 #endif // NN_NET_OSL_OSL_EVENTFLAG_H_
115