22#include "pedigree/kernel/Spinlock.h"
23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/process/WaitQueue.h"
25#include "pedigree/kernel/processor/state_forward.h"
26#include "pedigree/kernel/processor/types.h"
27#include "pedigree/kernel/utilities/List.h"
28#include "pedigree/kernel/utilities/new"
35#define EVENT_LIMIT 4096
37#define EVENT_TID_MAX 255
40#define MAX_NESTED_EVENTS 16
42#define EVENT_MAGIC 0x8899AABBCCDDEEFFULL
73 explicit operator bool()
const {
74 return m_pEvent !=
nullptr;
135 Event* operator->()
const {
139 explicit operator bool()
const {
140 return m_pEvent !=
nullptr;
152 void beginDispatch();
174 Event(uintptr_t handlerAddress,
bool isDeletable,
size_t specificNestingLevel = ~0UL,
179 static uintptr_t getTrampoline();
182 static uintptr_t getSecondaryTrampoline();
185 static uintptr_t getHandlerBuffer();
188 static size_t getHandlerBufferSize();
191 static uintptr_t getLastHandlerBuffer();
193#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
195 static constexpr size_t getHostedHandlerBufferSize(
size_t pageSize) {
196 return pageSize ? handlerBufferSize(pageSize) : 0;
203 virtual bool isDeletable();
224 static bool unserialize(uint8_t* pBuffer,
Event& event);
228 static size_t getEventType(uint8_t* pBuffer);
232 return m_HandlerAddress;
237 return m_HandlerPrivilege;
241 bool isValidHandlerMapping(
size_t mappingFlags)
const;
260 return UserReturnDelivery::NotApplicable;
265 return UserReturnDelivery::NotApplicable;
283 return m_NestingLevel;
293 size_t pendingCount();
299 bool tryAcquireRegistration(
SendLease& registration);
307 virtual void waitForDeliveries();
347 static constexpr size_t handlerBufferSize(
size_t pageSize) {
348 const size_t pageCount = (EVENT_LIMIT / pageSize) + ((EVENT_LIMIT % pageSize) ? 1 : 0);
349 return pageCount * pageSize;
353 SendLease beginSend();
355 void finishRetirement();
358 bool registerThread(
Thread* thread);
361 void deregisterThread(
Thread* thread);
367 void completeDelivery(
Thread* thread);
370 void beginDispatch(Delivery* delivery);
371 void endDispatch(Delivery* delivery);
virtual bool prefersAlternateUserStack() const
WaitQueue m_DeliveryWaiters
virtual UserReturnDelivery deliverAtUserReturn(SyscallState &)
HandlerPrivilege m_HandlerPrivilege
uintptr_t getHandlerAddress()
HandlerPrivilege getHandlerPrivilege() const
virtual bool isSignalEvent() const
virtual UserReturnDelivery deliverAtUserReturn(InterruptState &)
virtual bool requiresExactUserReturnState() const
size_t getSpecificNestingLevel()
virtual size_t getNumber()=0
List< Thread * > m_Threads
virtual bool isDeliverableWhileProcessSuspended() const
virtual size_t serialize(uint8_t *pBuffer)=0
Delivery * m_pFirstActiveDelivery
virtual Event * cloneForDelivery()
uintptr_t m_HandlerAddress