1 /* 2 * Copyright (C) 2007 The Android Open Source Project 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 ANDROID_BARRIER_H 18 #define ANDROID_BARRIER_H 19 20 #include <stdint.h> 21 #include <condition_variable> 22 #include <mutex> 23 24 namespace android { 25 26 class Barrier 27 { 28 public: 29 // Release any threads waiting at the Barrier. 30 // Provides release semantics: preceding loads and stores will be visible 31 // to other threads before they wake up. open()32 void open() { 33 std::lock_guard<std::mutex> lock(mMutex); 34 mIsOpen = true; 35 mCondition.notify_all(); 36 } 37 38 // Reset the Barrier, so wait() will block until open() has been called. close()39 void close() { 40 std::lock_guard<std::mutex> lock(mMutex); 41 mIsOpen = false; 42 } 43 44 // Wait until the Barrier is OPEN. 45 // Provides acquire semantics: no subsequent loads or stores will occur 46 // until wait() returns. wait()47 void wait() const { 48 std::unique_lock<std::mutex> lock(mMutex); 49 mCondition.wait(lock, [this]() NO_THREAD_SAFETY_ANALYSIS { return mIsOpen; }); 50 } 51 private: 52 mutable std::mutex mMutex; 53 mutable std::condition_variable mCondition; GUARDED_BY(mMutex)54 int mIsOpen GUARDED_BY(mMutex){false}; 55 }; 56 57 }; // namespace android 58 59 #endif // ANDROID_BARRIER_H 60