33 bool armHandler(
TimerHandler* handler, uint64_t deadline, uint64_t now);
36 uint64_t nextDeadline()
const;
50 bool dispatch(uint64_t delta,
TimerHandler* onlyHandler =
nullptr);
53 bool dispatchDue(uint64_t now);
58#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
63 using MutationLockHook = void (*)();
65 void setHandlerPinHook(HandlerPinHook hook);
66 void setHandlerPrePinHook(HandlerPrePinHook hook);
67 void setHandlerHazardClaimHook(HandlerHazardClaimHook hook);
68 void setHandlerAtomicDrainHook(HandlerAtomicDrainHook hook);
69 void withMutationLockForTest(MutationLockHook hook);
70 size_t activeDispatchCountForTest(
TimerHandler* handler);
71 size_t claimedDispatchCountForTest();
75 static constexpr size_t MaxHandlerSlots = 32;
76 static constexpr size_t MaxActiveDispatches = 64;
77 static constexpr uint64_t NoDeadline = ~static_cast<uint64_t>(0);
79 enum class SlotMode :
size_t {
87 static constexpr size_t ModeBits = 3;
88 static constexpr size_t ModeMask = (1 << ModeBits) - 1;
89 static constexpr size_t SelfRemovalBit = 1 << ModeBits;
90 static constexpr size_t SynchronousDrainBit = 1 << (ModeBits + 1);
91 static constexpr size_t GenerationShift = ModeBits + 2;
96 ActiveDispatch() : token(
nullptr), generation(0), owner(
nullptr), slot(
nullptr) {}
106 : handler(
nullptr), publication(0), deadline(NoDeadline), lastDispatch(NoDeadline) {}
111 uint64_t lastDispatch;
116 void* dispatchOwner,
size_t admittedPublication)
117 : registry(handlerRegistry),
119 owner(dispatchOwner),
120 publication(admittedPublication),
121 activeDispatch(
nullptr),
132 static size_t makePublication(
size_t generation, SlotMode mode,
bool selfRemoval =
false,
133 bool synchronousDrain =
false);
134 static size_t generationOf(
size_t publication);
135 static SlotMode modeOf(
size_t publication);
136 static bool selfRemovalOf(
size_t publication);
137 static bool synchronousDrainOf(
size_t publication);
142 static void abandonDispatch(
void* context);
144 bool findCurrentDispatch(
void* owner,
HandlerSlot* target,
bool& callbackContext)
const;
145 static void* currentDispatchOwner();
146 bool dispatchSelected(uint64_t delta,
TimerHandler* onlyHandler,
bool dueOnly, uint64_t now);
153#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
154 HandlerPinHook m_HandlerPinHook;
155 HandlerPrePinHook m_HandlerPrePinHook;
156 HandlerHazardClaimHook m_HandlerHazardClaimHook;
157 HandlerAtomicDrainHook m_HandlerAtomicDrainHook;