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