diff --git a/src/source_clang.cc b/src/source_clang.cc index b4cf264..8be875d 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -530,12 +530,6 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa autocomplete_state=AutocompleteState::CANCELED; return false; }); - - do_delete_object.connect([this](){ - if(delete_thread.joinable()) - delete_thread.join(); - delete this; - }); } void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { @@ -804,50 +798,6 @@ std::unordered_map Source::ClangViewAutocomplete::auto return map; } -void Source::ClangViewAutocomplete::async_delete() { - parsing_in_progress->cancel("canceled, freeing resources in the background"); - parse_state=ParseState::STOP; - delete_thread=std::thread([this](){ - //TODO: Is it possible to stop the clang-process in progress? - if(full_reparse_thread.joinable()) - full_reparse_thread.join(); - if(parse_thread.joinable()) - parse_thread.join(); - if(autocomplete_thread.joinable()) - autocomplete_thread.join(); - do_delete_object(); - }); -} - -bool Source::ClangViewAutocomplete::full_reparse() { - full_reparse_needed=false; - if(!full_reparse_running) { - auto expected=ParseState::PROCESSING; - if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) { - expected=ParseState::RESTARTING; - if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) - return false; - } - autocomplete_state=AutocompleteState::IDLE; - soft_reparse_needed=false; - full_reparse_running=true; - if(full_reparse_thread.joinable()) - full_reparse_thread.join(); - full_reparse_thread=std::thread([this](){ - if(parse_thread.joinable()) - parse_thread.join(); - if(autocomplete_thread.joinable()) - autocomplete_thread.join(); - dispatcher.post([this] { - parse_initialize(); - full_reparse_running=false; - }); - }); - return true; - } - return false; -} - Source::ClangViewRefactor::ClangViewRefactor(const boost::filesystem::path &file_path, Glib::RefPtr language) : Source::ClangViewParse(file_path, language) { @@ -1363,12 +1313,57 @@ Source::ClangView::ClangView(const boost::filesystem::path &file_path, Glib::Ref get_source_buffer()->set_highlight_syntax(true); get_source_buffer()->set_language(language); } + + do_delete_object.connect([this]() { + if(delete_thread.joinable()) + delete_thread.join(); + delete this; + }); +} + +bool Source::ClangView::full_reparse() { + full_reparse_needed=false; + if(!full_reparse_running) { + auto expected=ParseState::PROCESSING; + if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) { + expected=ParseState::RESTARTING; + if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) + return false; + } + autocomplete_state=AutocompleteState::IDLE; + soft_reparse_needed=false; + full_reparse_running=true; + if(full_reparse_thread.joinable()) + full_reparse_thread.join(); + full_reparse_thread=std::thread([this](){ + if(parse_thread.joinable()) + parse_thread.join(); + if(autocomplete_thread.joinable()) + autocomplete_thread.join(); + dispatcher.post([this] { + parse_initialize(); + full_reparse_running=false; + }); + }); + return true; + } + return false; } void Source::ClangView::async_delete() { dispatcher.disconnect(); delayed_reparse_connection.disconnect(); delayed_tag_similar_identifiers_connection.disconnect(); - ClangViewAutocomplete::async_delete(); + parsing_in_progress->cancel("canceled, freeing resources in the background"); + parse_state=ParseState::STOP; + delete_thread=std::thread([this](){ + //TODO: Is it possible to stop the clang-process in progress? + if(full_reparse_thread.joinable()) + full_reparse_thread.join(); + if(parse_thread.joinable()) + parse_thread.join(); + if(autocomplete_thread.joinable()) + autocomplete_thread.join(); + do_delete_object(); + }); } - diff --git a/src/source_clang.h b/src/source_clang.h index b9b74ad..58af802 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -68,13 +68,10 @@ namespace Source { }; ClangViewAutocomplete(const boost::filesystem::path &file_path, Glib::RefPtr language); - - virtual void async_delete(); - bool full_reparse() override; protected: + std::atomic autocomplete_state; std::thread autocomplete_thread; private: - std::atomic autocomplete_state; void autocomplete_dialog_setup(); void autocomplete_check(); void autocomplete(); @@ -84,11 +81,6 @@ namespace Source { std::string prefix; std::mutex prefix_mutex; static std::unordered_map autocomplete_manipulators_map(); - - Glib::Dispatcher do_delete_object; - std::thread delete_thread; - std::thread full_reparse_thread; - bool full_reparse_running=false; }; class ClangViewRefactor : public virtual ClangViewParse { @@ -125,7 +117,15 @@ namespace Source { class ClangView : public ClangViewAutocomplete, public ClangViewRefactor { public: ClangView(const boost::filesystem::path &file_path, Glib::RefPtr language); - void async_delete() override; + + bool full_reparse() override; + void async_delete(); + + private: + Glib::Dispatcher do_delete_object; + std::thread delete_thread; + std::thread full_reparse_thread; + bool full_reparse_running=false; }; }