37 static constexpr size_t MaxLines = 64;
38 using DispatchCallback = void (*)(
void*, uint8_t, size_t);
47 void* callbackContext);
51 bool initialise(
bool lazy =
false);
58 bool prepareLine(uint8_t line,
size_t processor);
64 bool canShutdown()
const;
66 bool isInitialised()
const;
69 bool isCurrentWorker()
const;
78 bool publishFromInterrupt(uint8_t line,
size_t cookie);
80#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
85 void setPublicationObservedHookForTest(PublicationObservedHook hook);
88 bool setPendingSlotCountForTest(
size_t slotCount);
91 bool publishFromSlotForTest(uint8_t line,
size_t slot,
size_t cookie);
94 void rejectNextPublicationForTest();
97 void setPendingScanAdmittedHookForTest(PendingScanAdmittedHook hook);
100 size_t remotePublicationRejectionsForTest()
const {
101 return __atomic_load_n(&m_RemotePublicationRejectionsForTest, __ATOMIC_ACQUIRE);
105 MUST_USE_RESULT bool setRemoteWakeCallbackForTest(RemoteWakeCallback callback,
106 void* callbackContext) {
109 m_ConfigurationLock.acquire();
110 if (__atomic_load_n(&m_ConfigurationClosed, __ATOMIC_ACQUIRE)) {
111 m_ConfigurationLock.release();
115 m_RemoteWakeCallback = callback;
116 m_RemoteWakeCallbackContext = callbackContext;
117 m_ConfigurationLock.release();
123 bool hasPending(uint8_t line)
const;
126 size_t pendingCookie(uint8_t line)
const;
127 size_t activeCookie(uint8_t line)
const;
128 size_t completedBatches(uint8_t line)
const;
129 size_t completedCookie(uint8_t line)
const;
130 uintptr_t workerIdentity(uint8_t line)
const;
131 bool callbackActive(uint8_t line)
const;
132 bool publicationClosed(uint8_t line)
const;
148 MUST_USE_RESULT bool setRemoteWakeCallback(RemoteWakeCallback callback,
void* callbackContext);
156 void* callbackContext);
157 bool start(
size_t processor);
160 bool publishFromInterrupt(
size_t cookie);
161 bool hasPending()
const;
162 bool isWorker(
const Thread* thread)
const;
163 size_t pendingCookie()
const;
164 size_t activeCookie()
const;
165 size_t completedBatches()
const;
166 size_t completedCookie()
const;
167 uintptr_t workerIdentity()
const;
168 bool callbackActive()
const;
169 bool publicationClosed()
const;
173 static constexpr size_t PublicationClosed =
static_cast<size_t>(1)
174 << ((
sizeof(
size_t) * 8) - 1);
175 static constexpr size_t PublicationCountMask = ~PublicationClosed;
177 static int workerEntry(
void* context);
179 bool hasPendingForWorker()
const;
180 size_t pendingCookieForWorker()
const;
181 size_t takePendingCookie();
182 static bool generationReached(
size_t current,
size_t target);
185 DispatchCallback m_Callback;
186 void* m_CallbackContext;
191 size_t m_WorkerProcessor;
193 size_t* m_PendingCookies;
194 size_t m_PendingCookieCount;
195 size_t m_ActiveCookie;
196 size_t m_CallbackActive;
197 mutable size_t m_PublicationState;
199 size_t m_CompletedBatches;
200 size_t m_CompletedCookie;
201 size_t m_PendingSinceTimestamp;
202 size_t m_ActiveCallbackStartedTimestamp;
203 size_t m_LastWakeLatency;
204 size_t m_MaximumWakeLatency;
205 size_t m_LastCallbackRuntime;
206 size_t m_MaximumCallbackRuntime;
209 Line& operator=(
const Line&) =
delete;
218 DispatchCallback m_Callback;
219 void* m_CallbackContext;
224 void* m_RemoteWakeCallbackContext;
227 size_t m_Initialised;
232#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
233 PublicationObservedHook m_PublicationObservedHook;
234 PendingScanAdmittedHook m_PendingScanAdmittedHook;
235 size_t m_PendingSlotCountForTest;
236 size_t m_PublicationSlotForTest;
237 size_t m_RejectNextPublicationForTest;
238 size_t m_RemotePublicationRejectionsForTest;