feature. See also
. The project being documented here (as the example) is the Zig library itself.
FsEvents.eventCallback
fn eventCallback(
stream: ConstFSEventStreamRef,
client_callback_info: ?*anyopaque,
num_events: usize,
events_paths_ptr: *anyopaque,
events_flags_ptr: [*]const FSEventStreamEventFlags,
events_ids_ptr: [*]const FSEventStreamEventId,
) callconv(.c) void
File
Code
fn eventCallback(
stream: ConstFSEventStreamRef,
client_callback_info: ?*anyopaque,
num_events: usize,
events_paths_ptr: *anyopaque,
events_flags_ptr: [*]const FSEventStreamEventFlags,
events_ids_ptr: [*]const FSEventStreamEventId,
) callconv(.c) void {
const ctx: *const EventCallbackCtx = @ptrCast(@alignCast(client_callback_info));
const maker = ctx.maker;
const fse = ctx.fse;
const rs = fse.resolved_symbols;
const events_paths_ptr_casted: [*]const [*:0]const u8 = @ptrCast(@alignCast(events_paths_ptr));
const events_paths = events_paths_ptr_casted[0..num_events];
const events_ids = events_ids_ptr[0..num_events];
const events_flags = events_flags_ptr[0..num_events];
var any_dirty = false;
for (events_paths, events_ids, events_flags) |event_path_nts, event_id, event_flags| {
_ = event_id;
if (event_flags.history_done) continue;
const event_path = std.mem.span(event_path_nts);
switch (event_flags.must_scan_sub_dirs) {
false => {
if (fse.watch_paths.get(event_path)) |steps| {
assert(steps.len > 0);
if (invalidateSteps(maker, steps)) any_dirty = true;
}
if (std.fs.path.dirname(event_path)) |event_dirname| {
if (fse.watch_paths.get(event_dirname)) |steps| {
assert(steps.len > 0);
if (invalidateSteps(maker, steps)) any_dirty = true;
}
}
},
true => {
// coalesced into one. We want to see if any of these events are actually relevant
// to us. The only way we can reasonably do that in this rare edge case is iterate
// the watch paths and see if any is under this directory. That's acceptable because
// we would otherwise kick off a rebuild which would be clearing those paths anyway.
const changed_path = std.fs.path.dirname(event_path) orelse event_path;
for (fse.watch_paths.keys(), fse.watch_paths.values()) |watching_path, steps| {
if (dirStartsWith(watching_path, changed_path)) {
if (invalidateSteps(maker, steps)) any_dirty = true;
}
}
},
}
}
if (any_dirty) {
fse.since_event = rs.FSEventStreamGetLatestEventId(stream);
_ = fse.waiting_semaphore.signal();
}
}