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: 32255 $
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 declarations follow
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