1/* 2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef GRAPHIC_LITE_GRAPHIC_LOCKER_H 17#define GRAPHIC_LITE_GRAPHIC_LOCKER_H 18 19#include "stdint.h" 20#if defined __linux__ || defined __LITEOS__ || defined __APPLE__ 21#include <pthread.h> 22#endif 23 24namespace OHOS { 25#if defined __linux__ || defined __LITEOS__ || defined __APPLE__ 26class GraphicLocker { 27public: 28 explicit GraphicLocker(pthread_mutex_t& mutex) : mutex_(mutex) 29 { 30 pthread_mutex_lock(&mutex_); 31 } 32 33 ~GraphicLocker() 34 { 35 pthread_mutex_unlock(&mutex_); 36 } 37 38 GraphicLocker() = delete; 39 GraphicLocker(const GraphicLocker&) = delete; 40 GraphicLocker& operator=(const GraphicLocker&) = delete; 41 42private: 43 pthread_mutex_t& mutex_; 44}; 45 46class GraphicMutex { 47public: 48 GraphicMutex() 49 { 50 pthread_mutexattr_t attr; 51 pthread_mutexattr_init(&attr); 52 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); 53 pthread_mutex_init(&mutex_, &attr); 54 } 55 ~GraphicMutex() 56 { 57 pthread_mutex_destroy(&mutex_); 58 } 59 void Lock() 60 { 61 pthread_mutex_lock(&mutex_); 62 } 63 void Unlock() 64 { 65 pthread_mutex_unlock(&mutex_); 66 } 67 GraphicMutex(const GraphicMutex&) = delete; 68 GraphicMutex(const GraphicMutex&&) = delete; 69 GraphicMutex& operator=(const GraphicMutex&) = delete; 70 GraphicMutex& operator=(const GraphicMutex&&) = delete; 71 72private: 73 pthread_mutex_t mutex_; 74}; 75#else 76class GraphicMutex { 77public: 78 GraphicMutex() = default; 79 ~GraphicMutex() = default; 80 void Lock() {} 81 void Unlock() {} 82 GraphicMutex(const GraphicMutex&) = delete; 83 GraphicMutex(const GraphicMutex&&) = delete; 84 GraphicMutex& operator=(const GraphicMutex&) = delete; 85 GraphicMutex& operator=(const GraphicMutex&&) = delete; 86}; 87#endif 88 89// do not support multi-thread 90class GraphicLockGuard { 91public: 92 explicit GraphicLockGuard(GraphicMutex& mutex) : mutex_(mutex) 93 { 94 Lock(); 95 } 96 ~GraphicLockGuard() 97 { 98 Unlock(); 99 } 100 void Lock() 101 { 102 mutex_.Lock(); 103 lockCnt_++; 104 } 105 void Unlock() 106 { 107 if (lockCnt_ > 0) { 108 mutex_.Unlock(); 109 lockCnt_--; 110 } 111 } 112 113 GraphicLockGuard() = delete; 114 GraphicLockGuard(const GraphicLockGuard&) = delete; 115 GraphicLockGuard(const GraphicLockGuard&&) = delete; 116 GraphicLockGuard& operator=(const GraphicLockGuard&) = delete; 117 GraphicLockGuard& operator=(const GraphicLockGuard&&) = delete; 118 119private: 120 GraphicMutex& mutex_; 121 int8_t lockCnt_ = 0; 122}; 123} // namespace OHOS 124#endif 125