mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
use an arena allocator for tty allocs
libuv always called the alloc cb right before read, and read owns the buffer. By using an arena, we're probably just reusing the same buffer over and over again. This should be quite fast. In tracing, this indeed changes the MTPC on ttyReadAlloc from ~750ns to ~275ns. I'll take it!
This commit is contained in:
@ -33,6 +33,7 @@ const WRITE_REQ_PREALLOC = std.math.pow(usize, 2, 5);
|
|||||||
|
|
||||||
/// Allocator
|
/// Allocator
|
||||||
alloc: Allocator,
|
alloc: Allocator,
|
||||||
|
alloc_io_arena: std.heap.ArenaAllocator,
|
||||||
|
|
||||||
/// The glfw window handle.
|
/// The glfw window handle.
|
||||||
window: glfw.Window,
|
window: glfw.Window,
|
||||||
@ -323,8 +324,15 @@ pub fn create(alloc: Allocator, loop: libuv.Loop, config: *const Config) !*Windo
|
|||||||
errdefer cursor.destroy();
|
errdefer cursor.destroy();
|
||||||
try window.setCursor(cursor);
|
try window.setCursor(cursor);
|
||||||
|
|
||||||
|
// Create our IO allocator arena. Libuv appears to guarantee (in code,
|
||||||
|
// not in docs) that read_alloc is called directly before a read so
|
||||||
|
// we can use an arena to make allocation faster.
|
||||||
|
var io_arena = std.heap.ArenaAllocator.init(alloc);
|
||||||
|
errdefer io_arena.deinit();
|
||||||
|
|
||||||
self.* = .{
|
self.* = .{
|
||||||
.alloc = alloc,
|
.alloc = alloc,
|
||||||
|
.alloc_io_arena = io_arena,
|
||||||
.window = window,
|
.window = window,
|
||||||
.cursor = cursor,
|
.cursor = cursor,
|
||||||
.focused = false,
|
.focused = false,
|
||||||
@ -410,6 +418,8 @@ pub fn destroy(self: *Window) void {
|
|||||||
// We can destroy the cursor right away. glfw will just revert any
|
// We can destroy the cursor right away. glfw will just revert any
|
||||||
// windows using it to the default.
|
// windows using it to the default.
|
||||||
self.cursor.destroy();
|
self.cursor.destroy();
|
||||||
|
|
||||||
|
self.alloc_io_arena.deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shouldClose(self: Window) bool {
|
pub fn shouldClose(self: Window) bool {
|
||||||
@ -1235,7 +1245,8 @@ fn ttyReadAlloc(t: *libuv.Tty, size: usize) ?[]u8 {
|
|||||||
const tracy = trace(@src());
|
const tracy = trace(@src());
|
||||||
defer tracy.end();
|
defer tracy.end();
|
||||||
|
|
||||||
const alloc = t.loop().getData(Allocator).?.*;
|
const win = t.getData(Window) orelse return null;
|
||||||
|
const alloc = win.alloc_io_arena.allocator();
|
||||||
return alloc.alloc(u8, size) catch null;
|
return alloc.alloc(u8, size) catch null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1245,7 +1256,10 @@ fn ttyRead(t: *libuv.Tty, n: isize, buf: []const u8) void {
|
|||||||
defer tracy.end();
|
defer tracy.end();
|
||||||
|
|
||||||
const win = t.getData(Window).?;
|
const win = t.getData(Window).?;
|
||||||
defer win.alloc.free(buf);
|
defer {
|
||||||
|
const alloc = win.alloc_io_arena.allocator();
|
||||||
|
alloc.free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
// log.info("DATA: {d}", .{n});
|
// log.info("DATA: {d}", .{n});
|
||||||
// log.info("DATA: {any}", .{buf[0..@intCast(usize, n)]});
|
// log.info("DATA: {any}", .{buf[0..@intCast(usize, n)]});
|
||||||
|
Reference in New Issue
Block a user