37 static constexpr size_t MaxLines = 17;
38 using DispatchCallback = void (*)(
void*, uint8_t, size_t);
47 void* callbackContext);
57 bool canShutdown()
const;
59 bool isInitialised()
const;
62 bool isCurrentWorker()
const;
71 bool publishFromInterrupt(uint8_t line,
size_t cookie);
73#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
78 void setPublicationObservedHookForTest(PublicationObservedHook hook);
81 bool setPendingSlotCountForTest(
size_t slotCount);
84 bool publishFromSlotForTest(uint8_t line,
size_t slot,
size_t cookie);
87 void rejectNextPublicationForTest();
90 void setPendingScanAdmittedHookForTest(PendingScanAdmittedHook hook);
93 size_t remotePublicationRejectionsForTest()
const {
94 return __atomic_load_n(&m_RemotePublicationRejectionsForTest, __ATOMIC_ACQUIRE);
98 MUST_USE_RESULT bool setRemoteWakeCallbackForTest(RemoteWakeCallback callback,
99 void* callbackContext) {
102 m_ConfigurationLock.acquire();
103 if (__atomic_load_n(&m_ConfigurationClosed, __ATOMIC_ACQUIRE)) {
104 m_ConfigurationLock.release();
108 m_RemoteWakeCallback = callback;
109 m_RemoteWakeCallbackContext = callbackContext;
110 m_ConfigurationLock.release();
116 bool hasPending(uint8_t line)
const;
119 size_t pendingCookie(uint8_t line)
const;
120 size_t activeCookie(uint8_t line)
const;
121 size_t completedBatches(uint8_t line)
const;
122 size_t completedCookie(uint8_t line)
const;
123 uintptr_t workerIdentity(uint8_t line)
const;
124 bool callbackActive(uint8_t line)
const;
125 bool publicationClosed(uint8_t line)
const;
141 MUST_USE_RESULT bool setRemoteWakeCallback(RemoteWakeCallback callback,
void* callbackContext);
149 void* callbackContext);
153 bool publishFromInterrupt(
size_t cookie);
154 bool hasPending()
const;
155 bool isWorker(
const Thread* thread)
const;
156 size_t pendingCookie()
const;
157 size_t activeCookie()
const;
158 size_t completedBatches()
const;
159 size_t completedCookie()
const;
160 uintptr_t workerIdentity()
const;
161 bool callbackActive()
const;
162 bool publicationClosed()
const;
166 static constexpr size_t PublicationClosed =
static_cast<size_t>(1)
167 << ((
sizeof(
size_t) * 8) - 1);
168 static constexpr size_t PublicationCountMask = ~PublicationClosed;
170 static int workerEntry(
void* context);
172 bool hasPendingForWorker()
const;
173 size_t pendingCookieForWorker()
const;
174 size_t takePendingCookie();
175 static bool generationReached(
size_t current,
size_t target);
178 DispatchCallback m_Callback;
179 void* m_CallbackContext;
184 size_t m_WorkerProcessor;
186 size_t* m_PendingCookies;
187 size_t m_PendingCookieCount;
188 size_t m_ActiveCookie;
189 size_t m_CallbackActive;
190 mutable size_t m_PublicationState;
192 size_t m_CompletedBatches;
193 size_t m_CompletedCookie;
194 size_t m_PendingSinceTimestamp;
195 size_t m_ActiveCallbackStartedTimestamp;
196 size_t m_LastWakeLatency;
197 size_t m_MaximumWakeLatency;
198 size_t m_LastCallbackRuntime;
199 size_t m_MaximumCallbackRuntime;
202 Line& operator=(
const Line&) =
delete;
205 Line m_Lines[MaxLines];
210 DispatchCallback m_Callback;
211 void* m_CallbackContext;
216 void* m_RemoteWakeCallbackContext;
219 size_t m_Initialised;
222#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
223 PublicationObservedHook m_PublicationObservedHook;
224 PendingScanAdmittedHook m_PendingScanAdmittedHook;
225 size_t m_PendingSlotCountForTest;
226 size_t m_PublicationSlotForTest;
227 size_t m_RejectNextPublicationForTest;
228 size_t m_RemotePublicationRejectionsForTest;