Barrier.h 1.7 KB

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