blob: f0655bfc52a10002df2f5ceed0446aabd4dfe62b [file]
//===-- 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 a different alignment "
"than the internal barrier type.");
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_BARRIER_H