274 using T_AsyncLoopWakeUp =
typename T_AsyncEventLoop::LoopWakeUp;
275 using T_AsyncFileReadiness =
typename T_AsyncEventLoop::FileReadiness;
276 using T_AsyncExternalCompletion =
typename T_AsyncEventLoop::ExternalCompletion;
277 using T_EventObject =
typename T_AsyncEventLoop::EventObjectType;
278 using T_AsyncResult =
typename T_AsyncEventLoop::ResultType;
280 void init(T_AsyncEventLoop& loop) { eventLoop = &loop; }
283 T_AsyncEventLoop* eventLoop =
nullptr;
286 virtual Result appleStartWakeUp()
override
288 SC_TRY_MSG(eventLoop !=
nullptr and fileSystemWatcher !=
nullptr,
"FileSystemWatcherAsync not initialized");
289 T_AsyncLoopWakeUp& wakeUp = asyncWakeUp;
290 wakeUp.callback.template bind<Self, &Self::onEventLoopNotification>(*
this);
291 return wakeUp.start(*eventLoop, eventObject);
294 virtual void appleSignalEventObject()
override { eventObject.signal(); }
296 virtual Result appleWakeUpAndWait()
override
298 const Result res = asyncWakeUp.wakeUp(*eventLoop);
303 void onEventLoopNotification(
typename T_AsyncLoopWakeUp::Result& result)
305 fileSystemWatcher->asyncNotify(
nullptr);
306 result.reactivateRequest(
true);
309 T_AsyncLoopWakeUp asyncWakeUp = {};
310 T_EventObject eventObject = {};
311#elif SC_PLATFORM_LINUX
312 virtual Result linuxStartSharedFileReadiness()
override
314 SC_TRY_MSG(eventLoop !=
nullptr and fileSystemWatcher !=
nullptr,
"FileSystemWatcherAsync not initialized");
315 SC_TRY(eventLoop->associateExternallyCreatedFileDescriptorHandle(notifyFd));
316 asyncPoll.callback.template bind<Self, &Self::onEventLoopNotification>(*
this);
317 return asyncPoll.start(*eventLoop, notifyFd);
320 virtual Result linuxStopSharedFileReadiness()
override {
return asyncPoll.stop(*eventLoop); }
322 void onEventLoopNotification(
typename T_AsyncFileReadiness::Result& result)
324 fileSystemWatcher->asyncNotify(
nullptr);
325 result.reactivateRequest(
true);
328 T_AsyncFileReadiness asyncPoll = {};
331 virtual Result windowsStartFolderExternalCompletion(
FolderWatcher& watcher,
void* handle)
override
333 SC_TRY_MSG(eventLoop !=
nullptr and fileSystemWatcher !=
nullptr,
"FileSystemWatcherAsync not initialized");
334 T_AsyncExternalCompletion& completion =
335 watcher.asyncStorage.template reinterpret_as<T_AsyncExternalCompletion>();
336 placementNew(completion);
337 completion.setDebugName(
"FileSystemWatcherAsync Completion");
338 completion.callback.template bind<Self, &Self::onEventLoopNotification>(*
this);
339 return completion.start(*eventLoop, handle);
342 virtual Result windowsRequestStopFolderExternalCompletion(
FolderWatcher& watcher)
override
344 T_AsyncExternalCompletion& completion =
345 watcher.asyncStorage.template reinterpret_as<T_AsyncExternalCompletion>();
347 windowsFolderCompletionStopped =
false;
348 onAsyncCompletionClose = [
this, &watcher](T_AsyncResult&)
350 T_AsyncExternalCompletion& completion =
351 watcher.asyncStorage.template reinterpret_as<T_AsyncExternalCompletion>();
352 completion.~T_AsyncExternalCompletion();
353 windowsFolderCompletionStopped =
true;
355 return completion.stop(*eventLoop, &onAsyncCompletionClose);
358 virtual Result windowsWaitFolderExternalCompletionStopped(
FolderWatcher&)
override
360 while (not windowsFolderCompletionStopped)
362 SC_TRY(eventLoop->runOnce());
367 virtual Result windowsMarkFolderExternalCompletionPending(
FolderWatcher& watcher)
override
369 T_AsyncExternalCompletion& completion =
370 watcher.asyncStorage.template reinterpret_as<T_AsyncExternalCompletion>();
371 return completion.markSubmissionPending();
374 virtual Result windowsClearFolderExternalCompletionPending(
FolderWatcher& watcher)
override
376 T_AsyncExternalCompletion& completion =
377 watcher.asyncStorage.template reinterpret_as<T_AsyncExternalCompletion>();
378 return completion.clearSubmissionPending();
381 virtual void* windowsGetOverlapped(
FolderWatcher& watcher)
override
383 T_AsyncExternalCompletion& completion =
384 watcher.asyncStorage.template reinterpret_as<T_AsyncExternalCompletion>();
385 return completion.getWindowsOverlapped();
388 void onEventLoopNotification(
typename T_AsyncExternalCompletion::Result& result)
390 SC_COMPILER_WARNING_PUSH_OFFSETOF;
391 auto& storage =
reinterpret_cast<decltype(FolderWatcher::asyncStorage)&
>(result.getAsync());
393 fileSystemWatcher->asyncNotify(&watcher);
394 if (watcher.parent !=
nullptr and result.getAsync().hasSubmissionPending())
396 result.reactivateRequest(
true);
398 SC_COMPILER_WARNING_POP_OFFSETOF;
401 Function<void(T_AsyncResult&)> onAsyncCompletionClose;
402 bool windowsFolderCompletionStopped =
false;