OSDN Git Service

Supporting Planes Reservation
[android-x86/external-IA-Hardware-Composer.git] / public / spinlock.h
1 /*
2 // Copyright (c) 2016 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16
17 #ifndef PUBLIC_SPINLOCK_H_
18 #define PUBLIC_SPINLOCK_H_
19
20 #include <atomic>
21
22 namespace hwcomposer {
23
24 class SpinLock {
25  public:
26   void lock() {
27     while (atomic_lock_.test_and_set(std::memory_order_acquire)) {
28     }
29   }
30
31   void unlock() {
32     atomic_lock_.clear(std::memory_order_release);
33   }
34
35  private:
36   std::atomic_flag atomic_lock_ = ATOMIC_FLAG_INIT;
37 };
38
39 class ScopedSpinLock {
40  public:
41   explicit ScopedSpinLock(SpinLock& lock) : lock_(lock) {
42     lock_.lock();
43     locked_ = true;
44   }
45
46   ~ScopedSpinLock() {
47     if (locked_) {
48       lock_.unlock();
49       locked_ = false;
50     }
51   }
52
53  private:
54   SpinLock& lock_;
55   bool locked_;
56 };
57
58 class ScopedSpinLocks {
59  public:
60   ScopedSpinLocks(SpinLock& lock1, SpinLock& lock2)
61       : lock1_(lock1), lock2_(lock2) {
62     lock1_.lock();
63     lock2_.lock();
64   }
65
66   ~ScopedSpinLocks() {
67     lock1_.unlock();
68     lock2_.unlock();
69   }
70
71  private:
72   SpinLock& lock1_;
73   SpinLock& lock2_;
74 };
75
76 }  // namespace hwcomposer
77 #endif  // PUBLIC_SPINLOCK_H_