1 /*
2  * Copyright (c) 2023 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 _SHARED_MUTEX_PRIVATE_H_
17 #define _SHARED_MUTEX_PRIVATE_H_
18 
19 #include "sched/execute_ctx.h"
20 #include "sync.h"
21 
22 namespace ffrt {
23 class SharedMutexPrivate {
24 public:
25     void Lock();
26     bool TryLock();
27     void LockShared();
28     bool TryLockShared();
29     void Unlock();
30 
31     SharedMutexPrivate() = default;
32     ~SharedMutexPrivate() = default;
33     SharedMutexPrivate(SharedMutexPrivate const&) = delete;
34     void operator = (SharedMutexPrivate const&) = delete;
35 
36 private:
37     fast_mutex mut;
38 
39     LinkedList wList1;
40     LinkedList wList2;
41 
42     unsigned state = 0;
43     static constexpr unsigned writeEntered = 1U << (sizeof(unsigned) * __CHAR_BIT__ - 1);
44     static constexpr unsigned readersMax = ~writeEntered;
45 
46     void Wait(LinkedList& wList, SharedMutexWaitType wtType);
47     void NotifyOne(LinkedList& wList);
48     void NotifyAll(LinkedList& wList);
49 };
50 } // namespace ffrt
51 #endif
52