blob: a632aa45b2aa2cd941968fba1ab389316ddedd3e [file] [log] [blame] [edit]
//===-- 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