Browse Source

Minor cleanup in Source::Diffview, and no longer unnecessarily locks parse_mutex before updating tags

merge-requests/399/head
eidheim 6 years ago
parent
commit
014df5dfe3
  1. 1
      src/autocomplete.h
  2. 28
      src/source_diff.cc
  3. 7
      src/source_diff.h
  4. 4
      src/window.cc

1
src/autocomplete.h

@ -22,6 +22,7 @@ public:
std::vector<std::string> rows; std::vector<std::string> rows;
Tooltips tooltips; Tooltips tooltips;
/// Never changed outside main thread
std::atomic<State> state = {State::idle}; std::atomic<State> state = {State::idle};
std::thread thread; std::thread thread;

28
src/source_diff.cc

@ -218,23 +218,17 @@ void Source::DiffView::configure() {
}); });
} }
} }
Git::Repository::Diff::Lines diff_lines;
if(diff) if(diff)
lines = diff->get_lines(parse_buffer.raw()); diff_lines = diff->get_lines(parse_buffer.raw());
else {
lines.added.clear();
lines.modified.clear();
lines.removed.clear();
}
auto expected = ParseState::processing; auto expected = ParseState::processing;
if(parse_state.compare_exchange_strong(expected, ParseState::postprocessing)) { if(parse_state.compare_exchange_strong(expected, ParseState::postprocessing)) {
parse_mutex.unlock(); parse_mutex.unlock();
dispatcher.post([this] { dispatcher.post([this, diff_lines = std::move(diff_lines)] {
if(parse_mutex.try_lock()) {
auto expected = ParseState::postprocessing; auto expected = ParseState::postprocessing;
if(parse_state.compare_exchange_strong(expected, ParseState::idle)) if(parse_state.compare_exchange_strong(expected, ParseState::idle))
update_lines(); update_tags(diff_lines);
parse_mutex.unlock();
}
}); });
} }
else else
@ -266,7 +260,7 @@ void Source::DiffView::rename(const boost::filesystem::path &path) {
canonical_file_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 iter = get_buffer()->get_insert()->get_iter();
auto insert_iter = iter; auto insert_iter = iter;
bool wrapped = false; bool wrapped = false;
@ -294,7 +288,7 @@ void Source::DiffView::git_goto_next_diff() {
Info::get().print("No changes found in current buffer"); 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; std::string details;
{ {
LockGuard lock(parse_mutex); LockGuard lock(parse_mutex);
@ -325,26 +319,26 @@ std::unique_ptr<Git::Repository::Diff> Source::DiffView::get_diff() {
return std::make_unique<Git::Repository::Diff>(repository->get_diff(relative_path)); return std::make_unique<Git::Repository::Diff>(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_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_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, 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_below, get_buffer()->begin(), get_buffer()->end());
get_buffer()->remove_tag(renderer->tag_removed_above, 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 start_iter = get_buffer()->get_iter_at_line(added.first);
auto end_iter = get_iter_at_line_end(added.second - 1); auto end_iter = get_iter_at_line_end(added.second - 1);
end_iter.forward_char(); end_iter.forward_char();
get_buffer()->apply_tag(renderer->tag_added, start_iter, end_iter); 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 start_iter = get_buffer()->get_iter_at_line(modified.first);
auto end_iter = get_iter_at_line_end(modified.second - 1); auto end_iter = get_iter_at_line_end(modified.second - 1);
end_iter.forward_char(); end_iter.forward_char();
get_buffer()->apply_tag(renderer->tag_modified, start_iter, end_iter); 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; Gtk::TextIter removed_start, removed_end;
if(line_nr >= 0) { if(line_nr >= 0) {
auto start_iter = get_buffer()->get_iter_at_line(line_nr); auto start_iter = get_buffer()->get_iter_at_line(line_nr);

7
src/source_diff.h

@ -37,8 +37,8 @@ namespace Source {
void rename(const boost::filesystem::path &path) override; void rename(const boost::filesystem::path &path) override;
void git_goto_next_diff(); void goto_next_diff();
std::string git_get_diff_details(); std::string get_diff_details();
Mutex canonical_file_path_mutex; Mutex canonical_file_path_mutex;
/// Use canonical path to follow symbolic links /// Use canonical path to follow symbolic links
@ -65,7 +65,6 @@ namespace Source {
sigc::connection delayed_monitor_changed_connection; sigc::connection delayed_monitor_changed_connection;
std::atomic<bool> monitor_changed; std::atomic<bool> monitor_changed;
Git::Repository::Diff::Lines lines GUARDED_BY(parse_mutex); void update_tags(const Git::Repository::Diff::Lines &diff_lines);
void update_lines() REQUIRES(parse_mutex);
}; };
} // namespace Source } // namespace Source

4
src/window.cc

@ -681,11 +681,11 @@ void Window::set_menu_actions() {
menu.add_action("source_git_next_diff", []() { menu.add_action("source_git_next_diff", []() {
if(auto view = Notebook::get().get_current_view()) if(auto view = Notebook::get().get_current_view())
view->git_goto_next_diff(); view->goto_next_diff();
}); });
menu.add_action("source_git_show_diff", []() { menu.add_action("source_git_show_diff", []() {
if(auto view = Notebook::get().get_current_view()) { 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()) if(diff_details.empty())
return; return;
std::string postfix; std::string postfix;

Loading…
Cancel
Save