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