build: allow selecting a backend at comptime instead of via a build flag
This commit is contained in:
parent
6930adae7f
commit
aa4e2920dd
6 changed files with 457 additions and 372 deletions
|
|
@ -1,6 +1,5 @@
|
|||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const build_options = @import("build_options");
|
||||
|
||||
pub const EventType = enum {
|
||||
created,
|
||||
|
|
@ -25,14 +24,9 @@ pub const Error = error{
|
|||
WatchFailed,
|
||||
};
|
||||
|
||||
/// True when the Linux inotify backend runs in poll mode (caller drives the
|
||||
/// event loop via poll_fd / handle_read_ready). False on all other platforms
|
||||
/// and on Linux when the `linux_read_thread` build option is set.
|
||||
pub const linux_poll_mode = builtin.os.tag == .linux and !build_options.linux_read_thread;
|
||||
|
||||
pub const ReadableStatus = enum {
|
||||
// TODO: is_readable, // backend may now read from fd (blocking mode)
|
||||
will_notify, // backend must wait for a handle_read_ready call
|
||||
pub const InterfaceType = enum {
|
||||
polling,
|
||||
threaded,
|
||||
};
|
||||
|
||||
pub const Handler = struct {
|
||||
|
|
@ -41,8 +35,31 @@ pub const Handler = struct {
|
|||
pub const VTable = struct {
|
||||
change: *const fn (handler: *Handler, path: []const u8, event_type: EventType, object_type: ObjectType) error{HandlerFailed}!void,
|
||||
rename: *const fn (handler: *Handler, src_path: []const u8, dst_path: []const u8, object_type: ObjectType) error{HandlerFailed}!void,
|
||||
/// Only present in Linux poll mode (linux_poll_mode == true).
|
||||
wait_readable: if (linux_poll_mode) *const fn (handler: *Handler) error{HandlerFailed}!ReadableStatus else void,
|
||||
};
|
||||
|
||||
pub fn change(handler: *Handler, path: []const u8, event_type: EventType, object_type: ObjectType) error{HandlerFailed}!void {
|
||||
return handler.vtable.change(handler, path, event_type, object_type);
|
||||
}
|
||||
|
||||
pub fn rename(handler: *Handler, src_path: []const u8, dst_path: []const u8, object_type: ObjectType) error{HandlerFailed}!void {
|
||||
return handler.vtable.rename(handler, src_path, dst_path, object_type);
|
||||
}
|
||||
};
|
||||
|
||||
/// Used only by the inotify backend in poll mode (caller drives the event
|
||||
/// loop via poll_fd / handle_read_ready)
|
||||
pub const PollingHandler = struct {
|
||||
vtable: *const VTable,
|
||||
|
||||
pub const ReadableStatus = enum {
|
||||
// TODO: is_readable, // backend may now read from fd (blocking mode)
|
||||
will_notify, // backend must wait for a handle_read_ready call
|
||||
};
|
||||
|
||||
pub const VTable = struct {
|
||||
change: *const fn (handler: *Handler, path: []const u8, event_type: EventType, object_type: ObjectType) error{HandlerFailed}!void,
|
||||
rename: *const fn (handler: *Handler, src_path: []const u8, dst_path: []const u8, object_type: ObjectType) error{HandlerFailed}!void,
|
||||
wait_readable: *const fn (handler: *Handler) error{HandlerFailed}!ReadableStatus,
|
||||
};
|
||||
|
||||
pub fn change(handler: *Handler, path: []const u8, event_type: EventType, object_type: ObjectType) error{HandlerFailed}!void {
|
||||
|
|
@ -54,10 +71,6 @@ pub const Handler = struct {
|
|||
}
|
||||
|
||||
pub fn wait_readable(handler: *Handler) error{HandlerFailed}!ReadableStatus {
|
||||
if (comptime linux_poll_mode) {
|
||||
return handler.vtable.wait_readable(handler);
|
||||
} else {
|
||||
unreachable;
|
||||
}
|
||||
return handler.vtable.wait_readable(handler);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue