From 014df5dfe3fa7674c2d190a80c0d28354c869a7c Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 8 Feb 2020 22:36:21 +0100 Subject: [PATCH] Minor cleanup in Source::Diffview, and no longer unnecessarily locks parse_mutex before updating tags --- src/autocomplete.h | 1 + src/source_diff.cc | 32 +++++++++++++------------------- src/source_diff.h | 7 +++---- src/window.cc | 4 ++-- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/autocomplete.h b/src/autocomplete.h index f8e95dd..3368ddd 100644 --- a/src/autocomplete.h +++ b/src/autocomplete.h @@ -22,6 +22,7 @@ public: std::vector rows; Tooltips tooltips; + /// Never changed outside main thread std::atomic state = {State::idle}; std::thread thread; diff --git a/src/source_diff.cc b/src/source_diff.cc index e1ae3ac..7638308 100644 --- a/src/source_diff.cc +++ b/src/source_diff.cc @@ -218,23 +218,17 @@ void Source::DiffView::configure() { }); } } + + Git::Repository::Diff::Lines diff_lines; if(diff) - lines = diff->get_lines(parse_buffer.raw()); - else { - lines.added.clear(); - lines.modified.clear(); - lines.removed.clear(); - } + diff_lines = diff->get_lines(parse_buffer.raw()); auto expected = ParseState::processing; if(parse_state.compare_exchange_strong(expected, ParseState::postprocessing)) { parse_mutex.unlock(); - dispatcher.post([this] { - if(parse_mutex.try_lock()) { - auto expected = ParseState::postprocessing; - if(parse_state.compare_exchange_strong(expected, ParseState::idle)) - update_lines(); - parse_mutex.unlock(); - } + dispatcher.post([this, diff_lines = std::move(diff_lines)] { + auto expected = ParseState::postprocessing; + if(parse_state.compare_exchange_strong(expected, ParseState::idle)) + update_tags(diff_lines); }); } else @@ -266,7 +260,7 @@ void Source::DiffView::rename(const boost::filesystem::path &path) { canonical_file_path = path; } -void Source::DiffView::git_goto_next_diff() { +void Source::DiffView::goto_next_diff() { auto iter = get_buffer()->get_insert()->get_iter(); auto insert_iter = iter; bool wrapped = false; @@ -294,7 +288,7 @@ void Source::DiffView::git_goto_next_diff() { Info::get().print("No changes found in current buffer"); } -std::string Source::DiffView::git_get_diff_details() { +std::string Source::DiffView::get_diff_details() { std::string details; { LockGuard lock(parse_mutex); @@ -325,26 +319,26 @@ std::unique_ptr Source::DiffView::get_diff() { return std::make_unique(repository->get_diff(relative_path)); } -void Source::DiffView::update_lines() { +void Source::DiffView::update_tags(const Git::Repository::Diff::Lines &diff_lines) { get_buffer()->remove_tag(renderer->tag_added, get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_tag(renderer->tag_modified, get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_tag(renderer->tag_removed, get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_tag(renderer->tag_removed_below, get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_tag(renderer->tag_removed_above, get_buffer()->begin(), get_buffer()->end()); - for(auto &added : lines.added) { + for(auto &added : diff_lines.added) { auto start_iter = get_buffer()->get_iter_at_line(added.first); auto end_iter = get_iter_at_line_end(added.second - 1); end_iter.forward_char(); get_buffer()->apply_tag(renderer->tag_added, start_iter, end_iter); } - for(auto &modified : lines.modified) { + for(auto &modified : diff_lines.modified) { auto start_iter = get_buffer()->get_iter_at_line(modified.first); auto end_iter = get_iter_at_line_end(modified.second - 1); end_iter.forward_char(); get_buffer()->apply_tag(renderer->tag_modified, start_iter, end_iter); } - for(auto &line_nr : lines.removed) { + for(auto &line_nr : diff_lines.removed) { Gtk::TextIter removed_start, removed_end; if(line_nr >= 0) { auto start_iter = get_buffer()->get_iter_at_line(line_nr); diff --git a/src/source_diff.h b/src/source_diff.h index 13b59c9..49e3bd1 100644 --- a/src/source_diff.h +++ b/src/source_diff.h @@ -37,8 +37,8 @@ namespace Source { void rename(const boost::filesystem::path &path) override; - void git_goto_next_diff(); - std::string git_get_diff_details(); + void goto_next_diff(); + std::string get_diff_details(); Mutex canonical_file_path_mutex; /// Use canonical path to follow symbolic links @@ -65,7 +65,6 @@ namespace Source { sigc::connection delayed_monitor_changed_connection; std::atomic monitor_changed; - Git::Repository::Diff::Lines lines GUARDED_BY(parse_mutex); - void update_lines() REQUIRES(parse_mutex); + void update_tags(const Git::Repository::Diff::Lines &diff_lines); }; } // namespace Source diff --git a/src/window.cc b/src/window.cc index 8fa2289..99d809b 100644 --- a/src/window.cc +++ b/src/window.cc @@ -681,11 +681,11 @@ void Window::set_menu_actions() { menu.add_action("source_git_next_diff", []() { if(auto view = Notebook::get().get_current_view()) - view->git_goto_next_diff(); + view->goto_next_diff(); }); menu.add_action("source_git_show_diff", []() { if(auto view = Notebook::get().get_current_view()) { - auto diff_details = view->git_get_diff_details(); + auto diff_details = view->get_diff_details(); if(diff_details.empty()) return; std::string postfix;