#ifndef LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_CNDVAR_H
#define LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_CNDVAR_H
#include "src/__support/macros/config.h"
#include "src/__support/threads/linux/futex_utils.h"
#include "src/__support/threads/linux/raw_mutex.h"
#include "src/__support/threads/mutex.h"
#include <stdint.h>
namespace LIBC_NAMESPACE_DECL {
class CndVar {
enum CndWaiterStatus : uint32_t {
WS_Waiting = 0xE,
WS_Signalled = 0x5,
};
struct CndWaiter {
Futex futex_word = WS_Waiting;
CndWaiter *next = nullptr;
};
CndWaiter *waitq_front;
CndWaiter *waitq_back;
RawMutex qmtx;
public:
LIBC_INLINE static int init(CndVar *cv) {
cv->waitq_front = cv->waitq_back = nullptr;
RawMutex::init(&cv->qmtx);
return 0;
}
LIBC_INLINE static void destroy(CndVar *cv) {
cv->waitq_front = cv->waitq_back = nullptr;
}
int wait(Mutex *m);
void notify_one();
void broadcast();
};
}
#endif