mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-12-29 17:44:49 +00:00
Related to #3224 Previously, Ghostty used a static API for async event handling: io_uring on Linux, kqueue on macOS. This commit changes the backend to be dynamic on Linux so that epoll will be used if io_uring isn't available, or if the user explicitly chooses it. This introduces a new config `async-backend` (default "auto") which can be set by the user to change the async backend in use. This is a best-effort setting: if the user requests io_uring but it isn't available, Ghostty will fall back to something that is and that choice is up to us. Basic benchmarking both in libxev and Ghostty (vtebench) show no noticeable performance differences introducing the dynamic API, nor choosing epoll over io_uring.
44 lines
1.6 KiB
Zig
44 lines
1.6 KiB
Zig
//! The options that are used to configure a terminal IO implementation.
|
|
|
|
const builtin = @import("builtin");
|
|
const xev = @import("../global.zig").xev;
|
|
const apprt = @import("../apprt.zig");
|
|
const renderer = @import("../renderer.zig");
|
|
const Command = @import("../Command.zig");
|
|
const Config = @import("../config.zig").Config;
|
|
const termio = @import("../termio.zig");
|
|
|
|
/// All size metrics for the terminal.
|
|
size: renderer.Size,
|
|
|
|
/// The full app configuration. This is only available during initialization.
|
|
/// The memory it points to is NOT stable after the init call so any values
|
|
/// in here must be copied.
|
|
full_config: *const Config,
|
|
|
|
/// The derived configuration for this termio implementation.
|
|
config: termio.Termio.DerivedConfig,
|
|
|
|
/// The backend for termio that implements where reads/writes are sourced.
|
|
backend: termio.Backend,
|
|
|
|
/// The mailbox for the terminal. This is how messages are delivered.
|
|
/// If you're using termio.Thread this MUST be "mailbox".
|
|
mailbox: termio.Mailbox,
|
|
|
|
/// The render state. The IO implementation can modify anything here. The
|
|
/// surface thread will setup the initial "terminal" pointer but the IO impl
|
|
/// is free to change that if that is useful (i.e. doing some sort of dual
|
|
/// terminal implementation.)
|
|
renderer_state: *renderer.State,
|
|
|
|
/// A handle to wake up the renderer. This hints to the renderer that that
|
|
/// a repaint should happen.
|
|
renderer_wakeup: xev.Async,
|
|
|
|
/// The mailbox for renderer messages.
|
|
renderer_mailbox: *renderer.Thread.Mailbox,
|
|
|
|
/// The mailbox for sending the surface messages.
|
|
surface_mailbox: apprt.surface.Mailbox,
|