66 lines · c
1//===-- PThreadEvent.h ------------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Created by Greg Clayton on 6/16/07.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_PTHREADEVENT_H14#define LLDB_TOOLS_DEBUGSERVER_SOURCE_PTHREADEVENT_H15 16#include <cstdint>17#include <ctime>18#include <functional>19#include <mutex>20 21class PThreadEvent {22public:23 PThreadEvent(uint32_t bits = 0, uint32_t validBits = 0);24 ~PThreadEvent();25 26 uint32_t NewEventBit();27 void FreeEventBits(const uint32_t mask);28 29 void ReplaceEventBits(const uint32_t bits);30 uint32_t GetEventBits() const;31 void SetEvents(const uint32_t mask);32 void ResetEvents(const uint32_t mask);33 // Wait for events to be set or reset. These functions take an optional34 // timeout value. If timeout is NULL an infinite timeout will be used.35 uint32_t36 WaitForSetEvents(const uint32_t mask,37 const struct timespec *timeout_abstime = NULL) const;38 uint32_t39 WaitForEventsToReset(const uint32_t mask,40 const struct timespec *timeout_abstime = NULL) const;41 42 uint32_t GetResetAckMask() const { return m_reset_ack_mask; }43 uint32_t SetResetAckMask(uint32_t mask) { return m_reset_ack_mask = mask; }44 uint32_t WaitForResetAck(const uint32_t mask,45 const struct timespec *timeout_abstime = NULL) const;46 47protected:48 mutable std::mutex m_mutex;49 mutable std::condition_variable m_set_condition;50 uint32_t m_bits;51 uint32_t m_validBits;52 uint32_t m_reset_ack_mask;53 54 uint32_t GetBitsMasked(uint32_t mask) const { return mask & m_bits; }55 56 uint32_t WaitForEventsImpl(const uint32_t mask,57 const struct timespec *timeout_abstime,58 std::function<bool()> predicate) const;59 60private:61 PThreadEvent(const PThreadEvent &) = delete;62 PThreadEvent &operator=(const PThreadEvent &rhs) = delete;63};64 65#endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_PTHREADEVENT_H66