44 bool dispatch(uint64_t delta,
TimerHandler* onlyHandler =
nullptr);
49#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
54 using MutationLockHook = void (*)();
56 void setHandlerPinHook(HandlerPinHook hook);
57 void setHandlerPrePinHook(HandlerPrePinHook hook);
58 void setHandlerHazardClaimHook(HandlerHazardClaimHook hook);
59 void setHandlerAtomicDrainHook(HandlerAtomicDrainHook hook);
60 void withMutationLockForTest(MutationLockHook hook);
61 size_t activeDispatchCountForTest(
TimerHandler* handler);
62 size_t claimedDispatchCountForTest();
66 static constexpr size_t MaxHandlerSlots = 32;
67 static constexpr size_t MaxActiveDispatches = 64;
69 enum class SlotMode :
size_t {
77 static constexpr size_t ModeBits = 3;
78 static constexpr size_t ModeMask = (1 << ModeBits) - 1;
79 static constexpr size_t SelfRemovalBit = 1 << ModeBits;
80 static constexpr size_t SynchronousDrainBit = 1 << (ModeBits + 1);
81 static constexpr size_t GenerationShift = ModeBits + 2;
86 ActiveDispatch() : token(
nullptr), generation(0), owner(
nullptr), slot(
nullptr) {}
103 void* dispatchOwner,
size_t admittedPublication)
104 : registry(handlerRegistry),
106 owner(dispatchOwner),
107 publication(admittedPublication),
117 static size_t makePublication(
size_t generation, SlotMode mode,
bool selfRemoval =
false,
118 bool synchronousDrain =
false);
119 static size_t generationOf(
size_t publication);
120 static SlotMode modeOf(
size_t publication);
121 static bool selfRemovalOf(
size_t publication);
122 static bool synchronousDrainOf(
size_t publication);
126 bool unpublishDispatch(
void* token,
HandlerSlot& slot,
size_t admittedPublication,
bool required);
127 static void abandonDispatch(
void* context);
129 bool findCurrentDispatch(
void* owner,
HandlerSlot* target,
bool& callbackContext)
const;
130 static void* currentDispatchOwner();
137#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
138 HandlerPinHook m_HandlerPinHook;
139 HandlerPrePinHook m_HandlerPrePinHook;
140 HandlerHazardClaimHook m_HandlerHazardClaimHook;
141 HandlerAtomicDrainHook m_HandlerAtomicDrainHook;