From bf9f1167a0abc7ea86eea26abf49ae4f95a6e0b7 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 20 Jul 2016 11:19:54 -0400 Subject: [PATCH] simplified dirty state tracker --- 4coder_default_include.cpp | 62 ++++++++++++++++++++------------------ 4ed.cpp | 7 +++-- 4ed_api_implementation.cpp | 2 +- 4ed_file.cpp | 45 ++++++++++++++++++--------- 4ed_file_view.cpp | 30 ++++++++++++------ README.txt | 2 +- internal_4coder_tests.cpp | 19 +++++++----- win32_4ed.cpp | 30 ++++++++++++++++++ 8 files changed, 132 insertions(+), 65 deletions(-) diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index 1c465425..3edf8d21 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -2263,35 +2263,6 @@ generic_search_all_buffers(Application_Links *app, General_Memory *general, Part Search_Range *ranges = set.ranges; - { - View_Summary view = app->get_active_view(app, AccessProtected); - Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, AccessProtected); - - int j = 0; - if (buffer.exists){ - ranges[0].type = SearchRange_FrontToBack; - ranges[0].flags = match_flags; - ranges[0].buffer = buffer.buffer_id; - ranges[0].start = 0; - ranges[0].size = buffer.size; - j = 1; - } - - for (Buffer_Summary buffer_it = app->get_buffer_first(app, AccessAll); - buffer_it.exists; - app->get_buffer_next(app, &buffer_it, AccessAll)){ - if (buffer.buffer_id != buffer_it.buffer_id){ - ranges[j].type = SearchRange_FrontToBack; - ranges[j].flags = match_flags; - ranges[j].buffer = buffer_it.buffer_id; - ranges[j].start = 0; - ranges[j].size = buffer_it.size; - ++j; - } - } - set.count = j; - } - Buffer_Summary search_buffer = app->get_buffer_by_name(app, literal("*search*"), AccessAll); if (!search_buffer.exists){ search_buffer = app->create_buffer(app, literal("*search*"), BufferCreate_AlwaysNew); @@ -2303,6 +2274,39 @@ generic_search_all_buffers(Application_Links *app, General_Memory *general, Part app->buffer_replace_range(app, &search_buffer, 0, search_buffer.size, 0, 0); } + { + View_Summary view = app->get_active_view(app, AccessProtected); + Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, AccessProtected); + + int j = 0; + if (buffer.exists){ + if (buffer.buffer_id != search_buffer.buffer_id){ + ranges[0].type = SearchRange_FrontToBack; + ranges[0].flags = match_flags; + ranges[0].buffer = buffer.buffer_id; + ranges[0].start = 0; + ranges[0].size = buffer.size; + j = 1; + } + } + + for (Buffer_Summary buffer_it = app->get_buffer_first(app, AccessAll); + buffer_it.exists; + app->get_buffer_next(app, &buffer_it, AccessAll)){ + if (buffer.buffer_id != buffer_it.buffer_id){ + if (search_buffer.buffer_id != buffer_it.buffer_id){ + ranges[j].type = SearchRange_FrontToBack; + ranges[j].flags = match_flags; + ranges[j].buffer = buffer_it.buffer_id; + ranges[j].start = 0; + ranges[j].size = buffer_it.size; + ++j; + } + } + } + set.count = j; + } + Temp_Memory temp = begin_temp_memory(part); Partition line_part = partition_sub_part(part, (4 << 10)); char *str = (char*)partition_current(part); diff --git a/4ed.cpp b/4ed.cpp index 4b133ce8..fe70ef97 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -1683,11 +1683,12 @@ App_Step_Sig(app_step){ file = (Editing_File*)node; terminate_with_null(&file->name.source_path); - time_stamp = - system->file_time_stamp(file->name.source_path.str); + time_stamp = system->file_time_stamp(file->name.source_path.str); if (time_stamp > 0){ - file->state.last_sys_write_time = time_stamp; + if (file->state.last_sync < time_stamp){ + file_mark_behind_os(file); + } } } } diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 5bfc5d24..d9e958a7 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -886,7 +886,6 @@ DOC_SEE(Buffer_Setting_ID) case BufferSetting_Eol: { file->settings.dos_write_mode = value; - file->state.last_4ed_edit_time = system->now_time_stamp(); }break; case BufferSetting_Unimportant: @@ -987,6 +986,7 @@ DOC_SEE(Buffer_Create_Flag) if (filename != 0){ String filename_string = make_string_terminated(part, filename, filename_len); Editing_File *file = working_set_contains(system, working_set, filename_string); + if (file == 0){ File_Loading loading = {0}; diff --git a/4ed_file.cpp b/4ed_file.cpp index 1dbe3d45..6cd4e199 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -144,9 +144,7 @@ struct Editing_File_State{ Text_Effect paste_effect; File_Sync_State sync; - u64 last_4ed_write_time; - u64 last_4ed_edit_time; - u64 last_sys_write_time; + u64 last_sync; File_Edit_Positions edit_pos_space[16]; File_Edit_Positions *edit_poss[16]; @@ -566,10 +564,13 @@ working_set_contains(System_Functions *system, Working_Set *working_set, String File_Entry *entry = 0; Editing_File *result = 0; working_set__entry_comp(system, filename, &entry_comp); + entry = (File_Entry*)table_find_item(&working_set->table, &entry_comp, system, tbl_string_hash, tbl_file_compare); + if (entry){ result = working_set_index(working_set, entry->id); } + return(result); } @@ -730,22 +731,14 @@ filename_match(String query, Absolutes *absolutes, String filename, b32 case_sen return result; } -inline File_Sync_State -buffer_get_sync(Editing_File *file){ - File_Sync_State result = SYNC_GOOD; - if (file->state.last_4ed_write_time != file->state.last_sys_write_time) - result = SYNC_BEHIND_OS; - else if (file->state.last_4ed_edit_time > file->state.last_sys_write_time) - result = SYNC_UNSAVED; - return result; -} - inline b32 buffer_needs_save(Editing_File *file){ b32 result = 0; - if (file->settings.unimportant == 0) - if (buffer_get_sync(file) == SYNC_UNSAVED) + if (!file->settings.unimportant){ + if (file->state.sync == SYNC_UNSAVED){ result = 1; + } + } return(result); } @@ -777,7 +770,29 @@ file_set_to_loading(Editing_File *file){ file->is_loading = 1; } +inline void +file_mark_clean(Editing_File *file){ + if (file->state.sync != SYNC_BEHIND_OS){ + file->state.sync = SYNC_GOOD; + } +} +inline void +file_mark_dirty(Editing_File *file){ + if (file->state.sync != SYNC_BEHIND_OS){ + file->state.sync = SYNC_UNSAVED; + } +} + +inline void +file_mark_behind_os(Editing_File *file){ + file->state.sync = SYNC_BEHIND_OS; +} + +inline File_Sync_State +file_get_sync(Editing_File *file){ + return (file->state.sync); +} // BOTTOM diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index 3da215e8..788ee03d 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -844,6 +844,8 @@ file_set_name(Working_Set *working_set, Editing_File *file, char *filename){ file_set_name(working_set, file, f); } + +#if 0 inline void file_synchronize_times(System_Functions *system, Editing_File *file, char *filename){ u64 stamp = system->file_time_stamp(filename); @@ -854,6 +856,13 @@ file_synchronize_times(System_Functions *system, Editing_File *file, char *filen } file->state.sync = buffer_get_sync(file); } +#endif + +inline void +file_synchronize_times(System_Functions *system, Editing_File *file){ + file->state.last_sync = system->now_time_stamp(); + file->state.sync = SYNC_GOOD; +} internal b32 file_save(System_Functions *system, Mem_Options *mem, Editing_File *file, char *filename){ @@ -897,13 +906,15 @@ file_save(System_Functions *system, Mem_Options *mem, Editing_File *file, char * result = system->file_save(filename, data, size); - file_synchronize_times(system, file, filename); + file_mark_clean(file); if (used_general){ general_memory_free(&mem->general, data); } end_temp_memory(temp); + file_synchronize_times(system, file); + return(result); } @@ -1071,10 +1082,9 @@ file_create_from_string(System_Functions *system, Models *models, } file_init_strings(file); - file_set_name(working_set, file, (char*)name); - file_synchronize_times(system, file, name); + file_synchronize_times(system, file); i16 font_id = models->global_font.font_id; file->settings.font_id = font_id; @@ -1119,6 +1129,8 @@ file_create_from_string(System_Functions *system, Models *models, file->settings.is_initialized = 1; } +#undef TEST_TIME_MAX + internal b32 file_create_empty(System_Functions *system, Models *models, Editing_File *file, char *filename){ @@ -2020,7 +2032,7 @@ file_pre_edit_maintenance(System_Functions *system, } file->state.still_lexing = 0; } - file->state.last_4ed_edit_time = system->now_time_stamp(); + file_mark_dirty(file); } struct Cursor_Fix_Descriptor{ @@ -3251,7 +3263,7 @@ view_save_file(System_Functions *system, Models *models, } } - if (file && (buffer_get_sync(file) != SYNC_GOOD || save_as)){ + if (file && (file_get_sync(file) != SYNC_GOOD || save_as)){ if (file_save(system, mem, file, filename_string.str)){ if (save_as){ file_set_name(working_set, file, filename_string.str); @@ -3745,7 +3757,7 @@ get_exhaustive_info(System_Functions *system, Working_Set *working_set, Exhausti result.message = string_zero(); if (result.is_loaded){ - switch (buffer_get_sync(file)){ + switch (file_get_sync(file)){ case SYNC_GOOD: result.message = message_loaded; break; case SYNC_BEHIND_OS: result.message = message_unsynced; break; case SYNC_UNSAVED: result.message = message_unsaved; break; @@ -4565,7 +4577,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su else{ message = string_zero(); if (!file->settings.unimportant){ - switch (buffer_get_sync(file)){ + switch (file_get_sync(file)){ case SYNC_BEHIND_OS: message = message_unsynced; break; case SYNC_UNSAVED: message = message_unsaved; break; } @@ -4586,7 +4598,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su message = string_zero(); if (!file->settings.unimportant){ - switch (buffer_get_sync(file)){ + switch (file_get_sync(file)){ case SYNC_BEHIND_OS: message = message_unsynced; break; case SYNC_UNSAVED: message = message_unsaved; break; } @@ -5659,7 +5671,7 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re } if (!file->settings.unimportant){ - switch (buffer_get_sync(file)){ + switch (file_get_sync(file)){ case SYNC_BEHIND_OS: { persist String out_of_sync = make_lit_string(" !"); diff --git a/README.txt b/README.txt index 5f2495f9..31b75631 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -Distribution Date: 18.7.2016 (dd.mm.yyyy) +Distribution Date: 20.7.2016 (dd.mm.yyyy) Thank you for contributing to the 4coder project! diff --git a/internal_4coder_tests.cpp b/internal_4coder_tests.cpp index d4207f7f..20782d8e 100644 --- a/internal_4coder_tests.cpp +++ b/internal_4coder_tests.cpp @@ -13,23 +13,28 @@ Allen Webster #define LOTS_OF_FILES "w:/4ed/data/lots_of_files" -#define TEST_TIME_B() -#define TEST_TIME_E() - - - #include "4coder_default_include.cpp" #include "4coder_default_building.cpp" +#include + +// NOTE(allen): This timing restriction is based on 4GHz and 60fps +// 4G / 60 ~= 70M Reserving most of that time for rendering and hopefully idling +// I set the goal of 10M for all tests. +#define TEST_TIME_B(m) DWORD64 time_start = __rdtsc(), time_max = m +#define TEST_TIME_E() DWORD64 time_total = __rdtsc() - time_start; if (time_total > time_max) {assert(!"failed timing");} +#define TEST_TIME_M(m) m = (float)(__rdtsc() - time_start) / time_max + CUSTOM_COMMAND_SIG(load_lots_of_files){ - TEST_TIME_B(); + TEST_TIME_B(10000000); File_List list = app->get_file_list(app, literal(LOTS_OF_FILES)); File_Info *info = list.infos; for (int i = 0; i < list.count; ++i, ++info){ if (!info->folder){ - app->create_buffer(app, info->filename, info->filename_len, BufferCreate_Background); + app->create_buffer(app, info->filename, info->filename_len, + BufferCreate_Background | BufferCreate_AlwaysNew); } } diff --git a/win32_4ed.cpp b/win32_4ed.cpp index 18d0fd34..bc646c27 100644 --- a/win32_4ed.cpp +++ b/win32_4ed.cpp @@ -233,6 +233,36 @@ Win32Ptr(void *h){ return(result); } +// +// Rudimentary Timing +// + +#define WIN32_TIMING 0 + +#if FRED_INTERNAL && WIN32_TIMING + +inline void +show_debug_timing(char *function, DWORD64 total){ + char output[512]; + String out = make_fixed_width_string(output); + append(&out, function); + append(&out, ' '); + append_u64_to_str(&out, (u64)(total)); + append(&out, '\n'); + terminate_with_null(&out); + OutputDebugStringA(output); +} + +#define TEST_TIME_B() DWORD64 start = __rdtsc() +#define TEST_TIME_E() DWORD64 total = __rdtsc() - start; show_debug_timing(__FUNCTION__, total) + +#else + +#define TEST_TIME_B() +#define TEST_TIME_E() + +#endif + // // Memory (not exposed to application, but needed in system_shared.cpp)