From 20422d902393b938572f768343b9eb8660139af8 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Mon, 5 May 2025 16:49:28 +0200 Subject: [PATCH] Bring back GC and new files for commands --- src/basic/basic.h | 8 ++ src/text_editor/buffer.h | 2 +- src/text_editor/commands.cpp | 2 +- src/text_editor/lua_api.cpp | 55 +++++------- src/text_editor/lua_api_generated.cpp | 2 +- src/text_editor/management.cpp | 124 +++++++++++++++----------- src/text_editor/text_editor.cpp | 2 +- src/text_editor/text_editor.h | 1 - 8 files changed, 103 insertions(+), 93 deletions(-) diff --git a/src/basic/basic.h b/src/basic/basic.h index 4a04dae..f767d56 100644 --- a/src/basic/basic.h +++ b/src/basic/basic.h @@ -178,6 +178,14 @@ void Dealloc(Allocator alo, T **p) { alo.proc(alo.object, AllocatorKind_Deallocate, *p, 0); *p = NULL; } +#define DeallocEx(alo, p) (alo).proc((alo).object, AllocatorKind_Deallocate, (p), 0); + +template +void Dealloc2(Allocator alo, T *p) { + if (*p == NULL) return; + alo.proc(alo.object, AllocatorKind_Deallocate, *p, 0); + *p = NULL; +} Allocator GetSystemAllocator(); #define MemoryZero(x, size) memset(x, 0, size) diff --git a/src/text_editor/buffer.h b/src/text_editor/buffer.h index 84cee70..df681d2 100644 --- a/src/text_editor/buffer.h +++ b/src/text_editor/buffer.h @@ -38,8 +38,8 @@ struct Buffer { int no_history : 1; int no_line_starts : 1; int dirty : 1; - int gc : 1; int changed_on_disk : 1; + int garbage : 1; }; }; diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index dbeee19..4339990 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -598,7 +598,7 @@ void SaveBuffer(View *view) { if (success) { buffer->file_mod_time = GetFileModTime(buffer->name); buffer->dirty = false; - buffer->gc = false; + buffer->garbage = false; } else { ReportWarningf("Failed to save file with name: %.*s", FmtString(buffer->name)); } diff --git a/src/text_editor/lua_api.cpp b/src/text_editor/lua_api.cpp index 2cc1fcb..3056e1e 100644 --- a/src/text_editor/lua_api.cpp +++ b/src/text_editor/lua_api.cpp @@ -16,26 +16,26 @@ String FieldString(lua_State *L, String name) { return result; } +void Command_JumpNew(BSet *set) { + CheckpointBeforeGoto(set->window); + String current_dir = ChopLastSlash(set->buffer->name); + String buffer_name = GetUniqueBufferName(current_dir, "temp"); + set->view = WindowOpenBufferView(set->window, buffer_name); + set->buffer = GetBuffer(set->view->active_buffer); + set->buffer->garbage = true; +} + void Command_ExecInNewBuffer(BSet set, String cmd, String working_dir) { - CheckpointBeforeGoto(set.window); - - Scratch scratch; - String buffer_name = GetUniqueBufferName(working_dir, "shell_command"); - - View *view = WindowOpenBufferView(set.window, buffer_name); - Buffer *buffer = GetBuffer(view->active_buffer); - buffer->gc = true; - Command_SelectRangeOneCursor(view, Rng(0)); - - Exec(view->id, true, cmd, working_dir); + BSet main = GetActiveMainSet(); + Command_JumpNew(&main); + Exec(main.view->id, true, cmd, working_dir); ActiveWindow = set.window->id; } View *Command_ExecHidden(String buffer_name, String cmd, String working_dir) { View *view = OpenBufferView(buffer_name); Buffer *buffer = GetBuffer(view->active_buffer); - buffer->gc = true; - Command_SelectRangeOneCursor(view, Rng(0)); + // buffer->garbage = true; Exec(view->id, true, cmd, working_dir); return view; } @@ -46,14 +46,6 @@ void Command_BeginJump(BSet *set, BufferID buffer_id = NullBufferID) { set->view = WindowOpenBufferView(set->window, set->buffer->name); } -void Command_BeginJumpCommandBuffer(BSet *set) { - String current_dir = Command_GetDir(); - Command_BeginJump(set, set->window->command_buffer); - set->buffer->name = GetUniqueBufferName(current_dir, WindowBufferName); - Command_SelectEntireBuffer(set->view); - Command_Replace(set->view, u""); -} - void Command_EndJump(BSet set) { Int pos = XYToPos(set.buffer, {0, set.buffer->line_starts.len - 1}); set.view->carets[0] = MakeCaret(pos); @@ -62,20 +54,18 @@ void Command_EndJump(BSet set) { void Command_ListBuffers() { BSet main = GetActiveMainSet(); - Command_BeginJumpCommandBuffer(&main); + ActiveWindow = main.window->id; + Command_JumpNew(&main); for (Buffer *it = FirstBuffer; it; it = it->next) { Command_Appendf(main.view, "%.*s\n", FmtString(it->name)); } - Command_EndJump(main); - ActiveWindow = main.window->id; } BSet Command_Exec(String cmd, String working_dir) { BSet set = GetActiveMainSet(); - Command_BeginJumpCommandBuffer(&set); - Exec(set.view->id, true, cmd, working_dir); - Command_EndJump(set); ActiveWindow = set.window->id; + Command_JumpNew(&set); + Exec(set.view->id, true, cmd, working_dir); return set; } @@ -100,14 +90,13 @@ BSet Command_Open(String path) { String col_string = FieldString(LuaState, "col"); Int col = strtoll(col_string.data, NULL, 10); + ActiveWindow = main.window->id; if (IsDir(file_path)) { - Command_BeginJumpCommandBuffer(&main); + Command_JumpNew(&main); Command_Appendf(main.view, "%.*s/..\n", FmtString(file_path)); for (FileIter it = IterateFiles(scratch, file_path); IsValid(it); Advance(&it)) { Command_Appendf(main.view, "%.*s\n", FmtString(it.absolute_path)); } - Command_EndJump(main); - ActiveWindow = main.window->id; } else { CheckpointBeforeGoto(main.window); View *view = WindowOpenBufferView(main.window, file_path); @@ -118,7 +107,6 @@ BSet Command_Open(String path) { } } UpdateScroll(main.window, true); - ActiveWindow = main.window->id; } else if (FieldString(LuaState, "kind") == "exec") { String cmd = FieldString(LuaState, "cmd"); String working_dir = FieldString(LuaState, "working_dir"); @@ -169,7 +157,7 @@ int Lua_Eval(lua_State *L) { return 0; } -int Lua_NewWindowCMD(lua_State *L) { +int Lua_NewBufferCMD(lua_State *L) { String string = lua_tostring(L, 1); lua_pop(L, 1); @@ -204,9 +192,8 @@ int Lua_Cmd(lua_State *L) { Command_EndJump(set); } else { BSet set = GetActiveMainSet(); - Command_BeginJumpCommandBuffer(&set); + Command_JumpNew(&set); Exec(set.view->id, true, cmd, working_dir); - Command_EndJump(set); ActiveWindow = set.window->id; } diff --git a/src/text_editor/lua_api_generated.cpp b/src/text_editor/lua_api_generated.cpp index e6bfea5..cf8bef4 100644 --- a/src/text_editor/lua_api_generated.cpp +++ b/src/text_editor/lua_api_generated.cpp @@ -1,7 +1,7 @@ luaL_Reg LuaFunctions[] = { {"C", Lua_C}, {"Eval", Lua_Eval}, - {"NewWindowCMD", Lua_NewWindowCMD}, + {"NewBufferCMD", Lua_NewBufferCMD}, {"Cmd", Lua_Cmd}, {"Print", Lua_Print}, {"Kill", Lua_Kill}, diff --git a/src/text_editor/management.cpp b/src/text_editor/management.cpp index 78be7d4..d8c0f1d 100644 --- a/src/text_editor/management.cpp +++ b/src/text_editor/management.cpp @@ -130,6 +130,14 @@ void InitBuffer(Allocator allocator, Buffer *buffer, String name, Int size = 409 if (!buffer->no_line_starts) Add(&buffer->line_starts, (Int)0); } +void DeallocBuffer(Buffer *buffer) { + Dealloc(&buffer->line_starts); + DeallocHistoryArray(&buffer->undo_stack); + DeallocHistoryArray(&buffer->redo_stack); + DeallocEx(buffer->line_starts.allocator, buffer->data); + DeallocEx(buffer->line_starts.allocator, buffer); +} + Buffer *CreateBuffer(Allocator allocator, String name, Int size) { Buffer *result = AllocType(allocator, Buffer); InitBuffer(allocator, result, name, size); @@ -153,9 +161,6 @@ Window *CreateWindow(bool create_command_buffer = true) { w->draw_scrollbar = StyleDrawScrollbar; w->draw_line_numbers = StyleDrawLineNumbers; w->id = AllocWindowID(w); - if (create_command_buffer) { - w->command_buffer = CreateBuffer(GetSystemAllocator(), GetUniqueBufferName(WorkingDir, WindowBufferName), 4096*2)->id; - } DLL_QUEUE_ADD(FirstWindow, LastWindow, w); WindowCount += 1; return w; @@ -428,47 +433,46 @@ View *WindowOpenBufferView(Window *new_parent_window, String name) { return result; } -Window *ViewIsReferenced(ViewID view) { +bool ViewIsReferenced(ViewID view) { + if (view == NullViewID) { + return true; + } + for (Window *it = FirstWindow; it; it = it->next) { - if (it->active_view == view || it->active_goto_list == view) return it; + if (it->active_view == view || it->active_goto_list == view) { + return true; + } } - return NULL; + return false; } -View *BufferIsReferenced(BufferID buffer_id) { - return FindView(buffer_id); -} - -Window *BufferIsCrumb(BufferID buffer_id) { +bool BufferIsCrumb(BufferID buffer_id) { for (Window *window = FirstWindow; window; window = window->next) { - For(window->goto_history) if (it.buffer_id == buffer_id) return window; - For(window->goto_redo) if (it.buffer_id == buffer_id) return window; + For(window->goto_history) if (it.buffer_id == buffer_id) return true; + For(window->goto_redo) if (it.buffer_id == buffer_id) return true; } - return NULL; + return false; +} + +bool BufferIsReferenced(BufferID buffer_id) { + if (buffer_id == NullBufferID) { + return true; + } + + View *view = FindView(buffer_id); + if (view) { + return true; + } + + if (BufferIsCrumb(buffer_id)) { + return true; + } + + return false; } void GarbageCollect() { Allocator sys_allocator = GetSystemAllocator(); - // IterRemove(Views) { - // IterRemovePrepare(Views); - // View *view = it.o; - // Buffer *buffer = GetBuffer(view->active_buffer); - // bool gc = buffer->gc; - // if (buffer->is_directory) { - // Window *ref = BufferIsCrumb(buffer->id); - // if (!ref) gc = true; - // } - - // Window *ref = ViewIsReferenced(view->id); - // if (gc && !ref) { - // Dealloc(&view->carets); - // remove_item = true; - - // RawAppendf(GCInfoBuffer, "view %.*s\n", FmtString(buffer->name)); - // Dealloc(sys_allocator, &view); - // } - // } - for (Buffer *it = FirstBuffer; it; it = it->next) { if (it->file_mod_time) { int64_t new_file_mod_time = GetFileModTime(it->name); @@ -477,26 +481,38 @@ void GarbageCollect() { } } } - // IterRemove(Buffers) { - // IterRemovePrepare(Buffers); - // Buffer *buffer = it.o; - // bool gc = buffer->gc; - // View *ref = BufferIsReferenced(buffer->id); - // if (gc && !ref) { - // Dealloc(&buffer->line_starts); - // DeallocHistoryArray(&buffer->undo_stack); - // DeallocHistoryArray(&buffer->redo_stack); - // Dealloc(buffer->line_starts.allocator, &buffer->data); - // remove_item = true; + for (View *it = FirstView, *next = NULL; it; it = next) { + next = it->next; - // RawAppendf(GCInfoBuffer, "buffer %.*s\n", FmtString(buffer->name)); - // Dealloc(sys_allocator, &buffer); - // } else if (buffer->file_mod_time) { - // int64_t new_file_mod_time = GetFileModTime(buffer->name); - // if (buffer->file_mod_time != new_file_mod_time) { - // buffer->changed_on_disk = true; - // } - // } - // } + Buffer *buffer = GetBuffer(it->active_buffer); + if (!buffer->garbage) { + continue; + } + + bool ref = ViewIsReferenced(it->id); + if (ref) { + continue; + } + + Dealloc(&it->carets); + DeallocEx(sys_allocator, it); + DLL_QUEUE_REMOVE(FirstView, LastView, it); + } + + for (Buffer *it = FirstBuffer, *next = NULL; it; it = next) { + next = it->next; + + if (!it->garbage) { + continue; + } + + bool ref = BufferIsReferenced(it->id); + if (ref) { + continue; + } + + DeallocBuffer(it); + DLL_QUEUE_REMOVE(FirstBuffer, LastBuffer, it); + } } diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index fbec506..017f0e9 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -227,7 +227,7 @@ void Windows_SetupVCVarsall(mco_coro *co) { { Scratch scratch; String working_dir = Command_GetDir(); - String buffer_name = GetUniqueBufferName(working_dir, "+cmd-"); + String buffer_name = GetUniqueBufferName(working_dir, "vcvarsall-"); String cmd = Format(scratch, "\"%.*s\" && set", FmtString(StyleVCVarsall)); view = Command_ExecHidden(buffer_name, cmd, working_dir); } diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index f34bf77..04254b1 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -42,7 +42,6 @@ struct Window { Array goto_redo; ViewID active_goto_list; - BufferID command_buffer; double mouse_scroller_offset; int z;