| //===-- A platform independent abstraction layer for barriers --*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_BARRIER_H |
| #define LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_BARRIER_H |
| |
| #include "hdr/pthread_macros.h" |
| #include "include/llvm-libc-types/pthread_barrier_t.h" |
| #include "include/llvm-libc-types/pthread_barrierattr_t.h" |
| #include "src/__support/threads/CndVar.h" |
| #include "src/__support/threads/mutex.h" |
| |
| namespace LIBC_NAMESPACE_DECL { |
| |
| // NOTE: if the size of this class changes, you must ensure that the size of |
| // pthread_barrier_t (found in include/llvm-libc/types/pthread_barrier_t.h) is |
| // the same size |
| class Barrier { |
| private: |
| unsigned expected; |
| unsigned waiting; |
| bool blocking; |
| CndVar entering; |
| CndVar exiting; |
| Mutex m; |
| |
| public: |
| static int init(Barrier *b, const pthread_barrierattr_t *attr, |
| unsigned count); |
| static int destroy(Barrier *b); |
| int wait(); |
| }; |
| |
| static_assert(sizeof(Barrier) <= sizeof(pthread_barrier_t), |
| "The public pthread_barrier_t type cannot accommodate the " |
| "internal barrier type."); |
| |
| static_assert(alignof(Barrier) <= alignof(pthread_barrier_t), |
| "The public pthread_barrier_t type has insufficient alignment " |
| "for the internal barrier type."); |
| |
| static_assert(sizeof(CndVar) <= 24, |
| "CndVar size exceeds the size in __barrier_type.h"); |
| |
| static_assert(sizeof(Mutex) <= 24, |
| "Mutex size exceeds the size in __barrier_type.h"); |
| |
| } // namespace LIBC_NAMESPACE_DECL |
| |
| #endif // LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_BARRIER_H |