From f929c86d18a668d9436394cfedc5c5d92e9fffa5 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 22 Feb 2024 21:52:20 -0800 Subject: [PATCH] terminal/new: fix allocation --- src/terminal/new/PageList.zig | 11 +++++------ src/terminal/new/PagePool.zig | 8 ++++++++ src/terminal/new/Screen.zig | 2 ++ src/terminal/new/main.zig | 2 +- src/terminal/new/page.zig | 4 ++-- 5 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 src/terminal/new/PagePool.zig diff --git a/src/terminal/new/PageList.zig b/src/terminal/new/PageList.zig index f2c6d3f7d..313847d96 100644 --- a/src/terminal/new/PageList.zig +++ b/src/terminal/new/PageList.zig @@ -210,22 +210,20 @@ fn ensureRows(self: *PageList, row: RowOffset, n: usize) !void { self.pages.insertAfter(page, next_page); page = next_page; - // we expect the pages at this point to be full capacity. we - // shrink them if we have to since they've never been used. - assert(page.data.size.rows == page.data.capacity.rows); - // If we have enough space, use it. - if (n_rem <= page.data.size.rows) { + if (n_rem <= page.data.capacity.rows) { page.data.size.rows = @intCast(n_rem); return; } + // created pages are always empty so fill it with blanks + page.data.size.rows = page.data.capacity.rows; + // Continue n_rem -= page.data.size.rows; } } -// TODO: test, refine pub fn grow(self: *PageList) !*List.Node { const next_page = try self.createPage(); // we don't errdefer this because we've added it to the linked @@ -246,6 +244,7 @@ fn createPage(self: *PageList) !*List.Node { .styles = page_default_styles, }), }; + page.data.size.rows = 0; return page; } diff --git a/src/terminal/new/PagePool.zig b/src/terminal/new/PagePool.zig new file mode 100644 index 000000000..52790a7d0 --- /dev/null +++ b/src/terminal/new/PagePool.zig @@ -0,0 +1,8 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; + +test { + const testing = std.testing; + try testing.expect(false); +} diff --git a/src/terminal/new/Screen.zig b/src/terminal/new/Screen.zig index 5082b41f2..4d899a1fd 100644 --- a/src/terminal/new/Screen.zig +++ b/src/terminal/new/Screen.zig @@ -136,6 +136,8 @@ pub fn cursorDownScroll(self: *Screen) !void { // No space, we need to allocate a new page and move the cursor to it. const new_page = try self.pages.grow(); + assert(new_page.data.size.rows == 0); + new_page.data.size.rows = 1; const page_offset: PageList.RowOffset = .{ .page = new_page, .row_offset = 0, diff --git a/src/terminal/new/main.zig b/src/terminal/new/main.zig index b4c3ee8a9..40b88e013 100644 --- a/src/terminal/new/main.zig +++ b/src/terminal/new/main.zig @@ -2,6 +2,7 @@ const builtin = @import("builtin"); const page = @import("page.zig"); pub const PageList = @import("PageList.zig"); +pub const PagePool = @import("PagePool.zig"); pub const Terminal = @import("Terminal.zig"); pub const Page = page.Page; @@ -12,7 +13,6 @@ test { _ = @import("bitmap_allocator.zig"); _ = @import("hash_map.zig"); _ = @import("page.zig"); - _ = @import("PageList.zig"); _ = @import("Screen.zig"); _ = @import("point.zig"); _ = @import("size.zig"); diff --git a/src/terminal/new/page.zig b/src/terminal/new/page.zig index ce21e6b79..99f6d1b5f 100644 --- a/src/terminal/new/page.zig +++ b/src/terminal/new/page.zig @@ -95,8 +95,8 @@ pub const Page = struct { /// requirements. This is enough to support a very large number of cells. /// The standard capacity is chosen as the fast-path for allocation. pub const std_capacity: Capacity = .{ - .cols = 250, - .rows = 250, + .cols = 120, + .rows = 520, .styles = 128, .grapheme_bytes = 1024, };