20#include "pedigree/kernel/process/Event.h"
21#include "pedigree/kernel/process/SignalEvent.h"
22#include "pedigree/kernel/process/Thread.h"
23#include "pedigree/kernel/processor/Processor.h"
24#include "pedigree/kernel/processor/ProcessorInformation.h"
25#include "pedigree/kernel/processor/types.h"
27SignalEvent::SignalEvent(uintptr_t handlerAddress,
size_t signalNum,
size_t specificNestingLevel,
28 uint64_t signalMask,
bool deferSignal,
bool isDeletable,
29 HandlerPrivilege handlerPrivilege, DeliveryDisposition disposition,
30 bool useAlternateUserStack,
size_t continuationEpoch)
31 :
Event(handlerAddress, isDeletable, specificNestingLevel, handlerPrivilege),
32 m_SignalNumber(signalNum),
33 m_SignalMask(signalMask),
34 m_DeferSignal(deferSignal),
35 m_ProcessDirected(false),
36 m_Disposition(disposition),
37 m_UseAlternateUserStack(useAlternateUserStack),
38 m_ContinuationEpoch(continuationEpoch),
46SignalEvent::SignalEvent(
const SignalEvent& other,
bool isDeletable)
47 :
Event(other.m_HandlerAddress, isDeletable, other.m_NestingLevel, other.m_HandlerPrivilege),
48 m_SignalNumber(other.m_SignalNumber),
49 m_SignalMask(other.m_SignalMask),
50 m_DeferSignal(other.m_DeferSignal),
51 m_ProcessDirected(other.m_ProcessDirected),
52 m_Disposition(other.m_Disposition),
53 m_UseAlternateUserStack(other.m_UseAlternateUserStack),
54 m_ContinuationEpoch(other.m_ContinuationEpoch),
55 m_SignalCode(other.m_SignalCode),
56 m_SenderProcess(other.m_SenderProcess),
57 m_SenderUser(other.m_SenderUser),
58 m_SignalValue(other.m_SignalValue),
59 m_TraceBypass(other.m_TraceBypass),
60 m_ChildStatus(other.m_ChildStatus),
61 m_ChildUserTime(other.m_ChildUserTime),
62 m_ChildSystemTime(other.m_ChildSystemTime) {}
64SignalEvent::~SignalEvent() {
65 if (m_DeliveryState) {
66 m_DeliveryState->complete(
false, 0);
84 int32_t timerId = 0, overrun = 0;
85 timerInfo(timerId, overrun);
86 completeSignalDelivery(overrun);
94 constexpr uint64_t UnblockableSignals =
95 (
static_cast<uint64_t
>(1) << (9 - 1)) | (
static_cast<uint64_t
>(1) << (19 - 1));
100 mask &= ~UnblockableSignals;
108bool SignalEvent::unserialize(uint8_t* pBuffer,
Event& event) {
109 pBuffer[0] =
static_cast<uint8_t
>(
event.getNumber() & 0xFF);
virtual bool isDeletable()
static ProcessorInformation & information()
virtual SignalEvent * cloneForDisposition()
size_t m_ContinuationEpoch
virtual size_t serialize(uint8_t *pBuffer)
virtual Event * cloneForDelivery()
DeliveryDisposition m_Disposition
void markSignalInterruptedWait()
void setSignalMask(uint64_t mask)
void setCurrentSignalDelivery(size_t signalNumber, size_t continuationEpoch)