//////////////////////////////// //~ Callback types #define W_CallbackFuncDef(func_name, arg_name) void func_name(String arg_name) typedef W_CallbackFuncDef(W_CallbackFunc, name); //////////////////////////////// //~ Event types Struct(W_Event) { String name; W_Event *next; }; //////////////////////////////// //~ Shared state #define W_DispatcherDelaySeconds 0.050 #define W_DispatcherDedupBins 128 Struct(W_SharedState) { P_Watch *watch; Atomic32 W_Shutdown; Counter watch_jobs_counter; Mutex watch_dispatcher_mutex; Arena *watch_events_arena; W_Event *first_watch_event; W_Event *last_watch_event; Cv watch_dispatcher_cv; Mutex watch_callbacks_mutex; W_CallbackFunc *watch_callbacks[64]; u64 num_watch_callbacks; }; extern W_SharedState W_shared_state; //////////////////////////////// //~ Startup void W_Startup(void); P_ExitFuncDef(W_Shutdown); //////////////////////////////// //~ Watch operations void W_RegisterCallback(W_CallbackFunc *callback); //////////////////////////////// //~ Callback job JobDecl(W_RunCallbacksJob, { String name; W_CallbackFunc **callbacks; }); //////////////////////////////// //~ Long running jobs JobDecl(W_MonitorJob, { i32 _; }); JobDecl(W_DispatcherJob, { i32 _; });