15442e15aSNick Desaulniers (paternity leave) //===-- A platform independent abstraction layer for cond vars --*- C++ -*-===// 25442e15aSNick Desaulniers (paternity leave) // 35442e15aSNick Desaulniers (paternity leave) // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45442e15aSNick Desaulniers (paternity leave) // See https://llvm.org/LICENSE.txt for license information. 55442e15aSNick Desaulniers (paternity leave) // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65442e15aSNick Desaulniers (paternity leave) // 75442e15aSNick Desaulniers (paternity leave) //===----------------------------------------------------------------------===// 85442e15aSNick Desaulniers (paternity leave) 95442e15aSNick Desaulniers (paternity leave) #ifndef LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_CNDVAR_H 105442e15aSNick Desaulniers (paternity leave) #define LLVM_LIBC___SUPPORT_SRC_THREADS_LINUX_CNDVAR_H 115442e15aSNick Desaulniers (paternity leave) 12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 135442e15aSNick Desaulniers (paternity leave) #include "src/__support/threads/linux/futex_utils.h" // Futex 14142afde0SSchrodinger ZHU Yifan #include "src/__support/threads/linux/raw_mutex.h" // RawMutex 155442e15aSNick Desaulniers (paternity leave) #include "src/__support/threads/mutex.h" // Mutex 165442e15aSNick Desaulniers (paternity leave) 175442e15aSNick Desaulniers (paternity leave) #include <stdint.h> // uint32_t 185442e15aSNick Desaulniers (paternity leave) 19*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 205442e15aSNick Desaulniers (paternity leave) 21142afde0SSchrodinger ZHU Yifan class CndVar { 225442e15aSNick Desaulniers (paternity leave) enum CndWaiterStatus : uint32_t { 235442e15aSNick Desaulniers (paternity leave) WS_Waiting = 0xE, 245442e15aSNick Desaulniers (paternity leave) WS_Signalled = 0x5, 255442e15aSNick Desaulniers (paternity leave) }; 265442e15aSNick Desaulniers (paternity leave) 275442e15aSNick Desaulniers (paternity leave) struct CndWaiter { 285442e15aSNick Desaulniers (paternity leave) Futex futex_word = WS_Waiting; 295442e15aSNick Desaulniers (paternity leave) CndWaiter *next = nullptr; 305442e15aSNick Desaulniers (paternity leave) }; 315442e15aSNick Desaulniers (paternity leave) 325442e15aSNick Desaulniers (paternity leave) CndWaiter *waitq_front; 335442e15aSNick Desaulniers (paternity leave) CndWaiter *waitq_back; 34142afde0SSchrodinger ZHU Yifan RawMutex qmtx; 355442e15aSNick Desaulniers (paternity leave) 36142afde0SSchrodinger ZHU Yifan public: 37142afde0SSchrodinger ZHU Yifan LIBC_INLINE static int init(CndVar *cv) { 385442e15aSNick Desaulniers (paternity leave) cv->waitq_front = cv->waitq_back = nullptr; 39142afde0SSchrodinger ZHU Yifan RawMutex::init(&cv->qmtx); 40142afde0SSchrodinger ZHU Yifan return 0; 415442e15aSNick Desaulniers (paternity leave) } 425442e15aSNick Desaulniers (paternity leave) 43142afde0SSchrodinger ZHU Yifan LIBC_INLINE static void destroy(CndVar *cv) { 445442e15aSNick Desaulniers (paternity leave) cv->waitq_front = cv->waitq_back = nullptr; 455442e15aSNick Desaulniers (paternity leave) } 465442e15aSNick Desaulniers (paternity leave) 475442e15aSNick Desaulniers (paternity leave) // Returns 0 on success, -1 on error. 485442e15aSNick Desaulniers (paternity leave) int wait(Mutex *m); 495442e15aSNick Desaulniers (paternity leave) void notify_one(); 505442e15aSNick Desaulniers (paternity leave) void broadcast(); 515442e15aSNick Desaulniers (paternity leave) }; 525442e15aSNick Desaulniers (paternity leave) 53*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 545442e15aSNick Desaulniers (paternity leave) 555442e15aSNick Desaulniers (paternity leave) #endif // LLVM_LIBC_SRC___SUPPORT_THREADS_LINUX_CNDVAR_H 56