42 enum class DeliveryDisposition {
47 SignalEvent(uintptr_t handlerAddress,
size_t signalNum,
size_t specificNestingLevel = ~0UL,
48 uint64_t signalMask = 0,
bool deferSignal =
true,
bool isDeletable =
false,
50 DeliveryDisposition disposition = DeliveryDisposition::CaughtHandler,
51 bool useAlternateUserStack =
false,
size_t continuationEpoch = 0);
56 void setChildStatus(int32_t status, uint64_t userTime, uint64_t systemTime) {
57 m_ChildStatus = status;
58 m_ChildUserTime = userTime;
59 m_ChildSystemTime = systemTime;
61 int32_t childStatus()
const {
64 uint64_t childUserTime()
const {
65 return m_ChildUserTime;
67 uint64_t childSystemTime()
const {
68 return m_ChildSystemTime;
70 uint64_t rebindGeneration()
const {
71 return m_RebindGeneration;
73 void setRebindGeneration(uint64_t value) {
74 m_RebindGeneration = value;
76 uint64_t queueSequence()
const {
77 return m_QueueSequence;
79 void setQueueSequence(uint64_t value) {
80 m_QueueSequence = value;
82 bool deliveryActive()
const {
83 return !m_DeliveryState || m_DeliveryState->active();
85 bool queuedIndividually()
const {
86 return m_SignalNumber >= 32 || (m_DeliveryState && m_DeliveryState->timer());
88 bool hasDeliveryState()
const {
89 return bool(m_DeliveryState);
92 m_DeliveryState = state;
95 event.m_DeliveryState = pedigree_std::move(m_DeliveryState);
96 event.m_TraceBypass = m_TraceBypass;
98 const void* deliverySource()
const {
99 return m_DeliveryState ? m_DeliveryState->source() :
nullptr;
101 void timerInfo(int32_t& timerId, int32_t& overrun)
const {
104 if (m_DeliveryState) {
105 m_DeliveryState->timerInfo(timerId, overrun);
108 void rejectSignalDelivery()
const {
110 m_DeliveryState->complete(
false, -1);
112 void completeSignalDelivery(int32_t overrun = 0)
const {
113 if (m_DeliveryState) {
114 m_DeliveryState->complete(
true, overrun);
118 void setTraceBypass(
bool value =
true) {
119 m_TraceBypass = value;
121 bool consumeTraceBypass() {
122 bool value = m_TraceBypass;
123 m_TraceBypass =
false;
126 virtual size_t serialize(uint8_t* pBuffer);
127 static bool unserialize(uint8_t* pBuffer,
Event& event);
134 return m_UseAlternateUserStack;
139 return m_SignalNumber == 9;
142 virtual Event* cloneForDelivery();
147 void setProcessDirected(
bool processDirected) {
148 m_ProcessDirected = processDirected;
151 bool isProcessDirected()
const {
152 return m_ProcessDirected;
156 void setSignalOrigin(int32_t signalCode, int32_t senderProcess, uint32_t senderUser) {
157 m_SignalCode = signalCode;
158 m_SenderProcess = senderProcess;
159 m_SenderUser = senderUser;
162 int32_t getSignalCode()
const {
166 int32_t getSenderProcess()
const {
167 return m_SenderProcess;
170 void setSignalValue(uint64_t value) {
171 m_SignalValue = value;
173 uint64_t getSignalValue()
const {
174 return m_SignalValue;
177 uint32_t getSenderUser()
const {
181 uint64_t getDeliverySignalMask()
const {
185 bool defersDeliveredSignal()
const {
186 return m_DeferSignal;
191 m_ContinuationEpoch = continuationEpoch;
194 size_t getContinuationEpoch()
const {
195 return m_ContinuationEpoch;
199 return m_SignalNumber;
229 int32_t m_SenderProcess;
230 uint32_t m_SenderUser;
231 uint64_t m_SignalValue;
233 bool m_TraceBypass =
false;
234 uint64_t m_RebindGeneration = 0;
235 uint64_t m_QueueSequence = 0;
236 int32_t m_ChildStatus = 0;
237 uint64_t m_ChildUserTime = 0, m_ChildSystemTime = 0;