| //===-- 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 |