xref: /OK3568_Linux_fs/external/rockit/tgi/sdk/include/rt_mutex.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2018 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  * author: martin.cheng@rock-chips.com
17*4882a593Smuzhiyun  *   date: 20180719
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include "rt_header.h" // NOLINT
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #ifndef INCLUDE_RT_BASE_RT_MUTEX_H_
23*4882a593Smuzhiyun #define INCLUDE_RT_BASE_RT_MUTEX_H_
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define RET_CHECK_REF(ref, ret) \
26*4882a593Smuzhiyun     do { \
27*4882a593Smuzhiyun         if (ref->isExited()) \
28*4882a593Smuzhiyun             return ret; \
29*4882a593Smuzhiyun     } while (0)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun typedef void *(*RTPthreadCallback)(void *);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun class RtMutex;
35*4882a593Smuzhiyun class RtCondition;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun  * for shorter type name and function name
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun class RtMutex {
41*4882a593Smuzhiyun  public:
42*4882a593Smuzhiyun     RtMutex();
43*4882a593Smuzhiyun     ~RtMutex();
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun     void lock();
46*4882a593Smuzhiyun     void unlock();
47*4882a593Smuzhiyun     int  trylock();
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun     class RtAutolock {
50*4882a593Smuzhiyun      public:
RtAutolock(RtMutex & rtMutex)51*4882a593Smuzhiyun         explicit inline RtAutolock(RtMutex& rtMutex)     // NOLINT
52*4882a593Smuzhiyun                 : mLock(rtMutex) {
53*4882a593Smuzhiyun             mLock.lock();
54*4882a593Smuzhiyun         }
RtAutolock(RtMutex * rtMutex)55*4882a593Smuzhiyun         explicit inline RtAutolock(RtMutex* rtMutex)
56*4882a593Smuzhiyun                 : mLock(*rtMutex) {
57*4882a593Smuzhiyun             mLock.lock();
58*4882a593Smuzhiyun         }
~RtAutolock()59*4882a593Smuzhiyun         inline ~RtAutolock() { mLock.unlock(); }
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun      private:
62*4882a593Smuzhiyun         RtMutex& mLock;
63*4882a593Smuzhiyun     };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun  private:
66*4882a593Smuzhiyun     friend class RtCondition;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun     void* mData;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun     RtMutex(const RtMutex &);
71*4882a593Smuzhiyun     RtMutex &operator = (const RtMutex&);
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun typedef RtMutex::RtAutolock RtAutoMutex;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /*
77*4882a593Smuzhiyun  * for shorter type name and function name
78*4882a593Smuzhiyun  */
79*4882a593Smuzhiyun class RtCondition {
80*4882a593Smuzhiyun  public:
81*4882a593Smuzhiyun     RtCondition();
82*4882a593Smuzhiyun     explicit RtCondition(int type);
83*4882a593Smuzhiyun     ~RtCondition();
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun     /*These functions atomically release mutex,
86*4882a593Smuzhiyun       but block on the condition variable*/
87*4882a593Smuzhiyun     INT32 wait(const RtMutex& rtMutex);
88*4882a593Smuzhiyun     INT32 wait(RtMutex* rtMutex);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun     /*returns with the timeout error*/
91*4882a593Smuzhiyun     INT32 timedwait(const RtMutex& rtMutex, UINT64 timeout_us);
92*4882a593Smuzhiyun     INT32 timedwait(RtMutex* rtMutex, UINT64 timeout_us);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun     /*This wakes up at least one thread blocked on the condition variable*/
95*4882a593Smuzhiyun     INT32 signal();
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     /*This wakes up all of the threads blocked on the condition variable*/
98*4882a593Smuzhiyun     INT32 broadcast();
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun  private:
101*4882a593Smuzhiyun     void* mData;
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun class RtSemaphore {
105*4882a593Smuzhiyun  public:
106*4882a593Smuzhiyun     RtSemaphore();
107*4882a593Smuzhiyun     ~RtSemaphore();
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun     INT32 init(INT32 pshared, UINT32 value);
110*4882a593Smuzhiyun     INT32 getValue(int *val);
111*4882a593Smuzhiyun     INT32 tryWait();
112*4882a593Smuzhiyun     INT32 wait();
113*4882a593Smuzhiyun     INT32 post();
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun  private:
116*4882a593Smuzhiyun     void* mData;
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun class RtReference {
120*4882a593Smuzhiyun  public:
121*4882a593Smuzhiyun     RtReference();
122*4882a593Smuzhiyun     ~RtReference();
123*4882a593Smuzhiyun     void addRef();
124*4882a593Smuzhiyun     void decRef();
125*4882a593Smuzhiyun     void wait();
126*4882a593Smuzhiyun     void waitExit();
127*4882a593Smuzhiyun     void reset();
128*4882a593Smuzhiyun     RT_BOOL isExited();
129*4882a593Smuzhiyun     INT32 getRefValue();
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun  private:
132*4882a593Smuzhiyun     RT_BOOL       mIsExit;
133*4882a593Smuzhiyun     INT32         mRefNum;
134*4882a593Smuzhiyun     RtCondition  *mCond;
135*4882a593Smuzhiyun     RtMutex      *mLock;
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun class RtAutoRef {
139*4882a593Smuzhiyun  public:
RtAutoRef(RtReference * ref)140*4882a593Smuzhiyun     explicit inline RtAutoRef(RtReference* ref)
141*4882a593Smuzhiyun             : mRef(ref) {
142*4882a593Smuzhiyun        mRef->addRef();
143*4882a593Smuzhiyun     }
144*4882a593Smuzhiyun 
~RtAutoRef()145*4882a593Smuzhiyun     inline ~RtAutoRef() {
146*4882a593Smuzhiyun         mRef->decRef();
147*4882a593Smuzhiyun     }
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun  private:
150*4882a593Smuzhiyun     RtReference* mRef;
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #endif  // INCLUDE_RT_BASE_RT_MUTEX_H_
155*4882a593Smuzhiyun 
156