nightwatch/examples/simple-polling.zig

55 lines
2.3 KiB
Zig

//! Minimal nightwatch example: watch the current directory with the Linux
//! inotify polling backend and print every event to stderr.
//!
//! Build and run (from this directory):
//!
//! zig build-exe \
//! --dep nightwatch -Msimple-polling=simple-polling.zig \
//! --dep build_options -Mnightwatch=../src/nightwatch.zig \
//! -Mbuild_options=build_options.zig
//! ./simple-polling
const nightwatch = @import("nightwatch");
const std = @import("std");
// The .polling variant is Linux-only (inotify). Unlike the threaded backends,
// it does not spawn an internal thread; instead the caller drives event
// delivery by polling poll_fd() for readability and calling handle_read_ready()
// whenever data is available. The handler vtable requires an extra
// wait_readable callback that the backend calls to notify the handler that it
// should re-arm the fd in its polling loop before the next handle_read_ready().
const Watcher = nightwatch.Create(.polling);
const H = struct {
handler: Watcher.Handler,
const vtable = Watcher.Handler.VTable{ .change = change, .rename = rename, .wait_readable = wait_readable };
fn change(_: *Watcher.Handler, path: []const u8, event: nightwatch.EventType, _: nightwatch.ObjectType) error{HandlerFailed}!void {
std.debug.print("{s} {s}\n", .{ @tagName(event), path });
}
fn rename(_: *Watcher.Handler, src: []const u8, dst: []const u8, _: nightwatch.ObjectType) error{HandlerFailed}!void {
std.debug.print("rename {s} -> {s}\n", .{ src, dst });
}
// Called by the backend at arm time and after each handle_read_ready().
// Return .will_notify (currently the only option) to signal that the
// caller's loop will drive delivery.
fn wait_readable(_: *Watcher.Handler) error{HandlerFailed}!Watcher.Handler.ReadableStatus {
return .will_notify;
}
};
pub fn main(init: std.process.Init) !void {
var h = H{ .handler = .{ .vtable = &H.vtable } };
var watcher = try Watcher.init(init.io, init.gpa, &h.handler);
defer watcher.deinit();
try watcher.watch(".");
var pfd = [_]std.posix.pollfd{.{ .fd = watcher.poll_fd(), .events = std.posix.POLL.IN, .revents = 0 }};
while (true) {
_ = try std.posix.poll(&pfd, -1);
try watcher.handle_read_ready();
}
}