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