20#include "pedigree/kernel/Atomic.h"
21#include "pedigree/kernel/machine/Machine.h"
22#include "pedigree/kernel/machine/Timer.h"
23#include "pedigree/kernel/process/Event.h"
24#include "pedigree/kernel/process/PerProcessorScheduler.h"
25#include "pedigree/kernel/process/Thread.h"
26#include "pedigree/kernel/process/eventNumbers.h"
27#include "pedigree/kernel/processor/Processor.h"
28#include "pedigree/kernel/processor/ProcessorInformation.h"
29#include "pedigree/kernel/processor/types.h"
30#include "pedigree/kernel/time/Time.h"
31#include "pedigree/kernel/utilities/assert.h"
32#include "pedigree/kernel/utilities/new"
35static void delayTimerFired(uint8_t* pBuffer) {
44 virtual size_t serialize(uint8_t* pBuffer);
56#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
66void discardDelay(
void* context) {
67 DelayDiscard* discard =
reinterpret_cast<DelayDiscard*
>(context);
68 void* alarm = discard->alarm;
69 discard->alarm =
nullptr;
78 DelayDiscard discard = {addAlarm(nanoseconds)};
85 const Thread::InterruptionReason interruption = pThread->getInterruptionReason();
86 if (interruption == Thread::InterruptedByTimeout) {
87 discardDelay(&discard);
88 pThread->clearInterruption();
90 }
else if (interruption == Thread::InterruptedBySignal) {
91 discardDelay(&discard);
94 discardDelay(&discard);
98 pThread->clearInterruption();
107#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
108 g_HostedAlarmCreates += 1;
110 uint64_t usecs = nanoseconds / Multiplier::Microsecond;
114 pThread->clearInterruption();
120void removeAlarm(
void* handle) {
121 assert(handle !=
nullptr);
123 DelayTimerEvent* pEvent =
reinterpret_cast<DelayTimerEvent*
>(handle);
131 pEvent->owner()->cullEvent(pEvent);
135 pEvent->waitForDeliveries();
139DelayTimerEvent::DelayTimerEvent(
Thread* owner,
size_t nestingLevel)
140 :
Event(reinterpret_cast<uintptr_t>(&delayTimerFired), false, nestingLevel), m_pOwner(owner) {}
141DelayTimerEvent::~DelayTimerEvent() {
142#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
143 g_HostedAlarmDestroys += 1;
151bool DelayTimerEvent::unserialize(uint8_t* pBuffer,
DelayTimerEvent& event) {
156 return EventNumbers::DelayTimer;
159#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
160size_t getHostedAlarmCreateCount() {
161 return g_HostedAlarmCreates;
164size_t getHostedAlarmDestroyCount() {
165 return g_HostedAlarmDestroys;
virtual Timer * getTimer()=0
static ProcessorInformation & information()
@ Continue
No unwind necessary, carry on as normal.
void waitForEvent(WaitQueue::StackDiscardCleanup onStackDiscard=nullptr, void *stackDiscardContext=nullptr)
UnwindType getUnwindState()
size_t getStateLevel() const
virtual size_t serialize(uint8_t *pBuffer)
virtual size_t getNumber()
virtual void removeAlarm(class Event *pEvent)=0
virtual void addAlarm(class Event *pEvent, size_t alarmSecs, size_t alarmUsecs=0)=0