xref: /llvm-project/libc/src/__support/threads/CndVar.h (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
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