130fdc8d8SChris Lattner //===-- PThreadEvent.h ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner // 930fdc8d8SChris Lattner // Created by Greg Clayton on 6/16/07. 1030fdc8d8SChris Lattner // 1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 1230fdc8d8SChris Lattner 13cdc514e4SJonas Devlieghere #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_PTHREADEVENT_H 14cdc514e4SJonas Devlieghere #define LLDB_TOOLS_DEBUGSERVER_SOURCE_PTHREADEVENT_H 1530fdc8d8SChris Lattner #include "PThreadCondition.h" 16b9c1b51eSKate Stone #include "PThreadMutex.h" 17*76e47d48SRaphael Isemann #include <cstdint> 18*76e47d48SRaphael Isemann #include <ctime> 1930fdc8d8SChris Lattner 20b9c1b51eSKate Stone class PThreadEvent { 2130fdc8d8SChris Lattner public: 2230fdc8d8SChris Lattner PThreadEvent(uint32_t bits = 0, uint32_t validBits = 0); 2330fdc8d8SChris Lattner ~PThreadEvent(); 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner uint32_t NewEventBit(); 2630fdc8d8SChris Lattner void FreeEventBits(const uint32_t mask); 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner void ReplaceEventBits(const uint32_t bits); 2930fdc8d8SChris Lattner uint32_t GetEventBits() const; 3030fdc8d8SChris Lattner void SetEvents(const uint32_t mask); 3130fdc8d8SChris Lattner void ResetEvents(const uint32_t mask); 3230fdc8d8SChris Lattner // Wait for events to be set or reset. These functions take an optional 3330fdc8d8SChris Lattner // timeout value. If timeout is NULL an infinite timeout will be used. 34b9c1b51eSKate Stone uint32_t 35b9c1b51eSKate Stone WaitForSetEvents(const uint32_t mask, 36b9c1b51eSKate Stone const struct timespec *timeout_abstime = NULL) const; 37b9c1b51eSKate Stone uint32_t 38b9c1b51eSKate Stone WaitForEventsToReset(const uint32_t mask, 39b9c1b51eSKate Stone const struct timespec *timeout_abstime = NULL) const; 4030fdc8d8SChris Lattner GetResetAckMask()4130fdc8d8SChris Lattner uint32_t GetResetAckMask() const { return m_reset_ack_mask; } SetResetAckMask(uint32_t mask)4230fdc8d8SChris Lattner uint32_t SetResetAckMask(uint32_t mask) { return m_reset_ack_mask = mask; } 43b9c1b51eSKate Stone uint32_t WaitForResetAck(const uint32_t mask, 44b9c1b51eSKate Stone const struct timespec *timeout_abstime = NULL) const; 45b9c1b51eSKate Stone 4630fdc8d8SChris Lattner protected: 476a7f3338SBruce Mitchener // pthread condition and mutex variable to control access and allow 4830fdc8d8SChris Lattner // blocking between the main thread and the spotlight index thread. 4930fdc8d8SChris Lattner mutable PThreadMutex m_mutex; 5030fdc8d8SChris Lattner mutable PThreadCondition m_set_condition; 5130fdc8d8SChris Lattner mutable PThreadCondition m_reset_condition; 5230fdc8d8SChris Lattner uint32_t m_bits; 5330fdc8d8SChris Lattner uint32_t m_validBits; 5430fdc8d8SChris Lattner uint32_t m_reset_ack_mask; 55b9c1b51eSKate Stone 5630fdc8d8SChris Lattner private: 57c1874097SJonas Devlieghere PThreadEvent(const PThreadEvent &) = delete; 58c1874097SJonas Devlieghere PThreadEvent &operator=(const PThreadEvent &rhs) = delete; 5930fdc8d8SChris Lattner }; 6030fdc8d8SChris Lattner 61cdc514e4SJonas Devlieghere #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_PTHREADEVENT_H 62