Browse Source

Cleanup of source_clang's async_delete and full_reparse

merge-requests/365/head
eidheim 10 years ago
parent
commit
817e863895
  1. 99
      src/source_clang.cc
  2. 20
      src/source_clang.h

99
src/source_clang.cc

@ -530,12 +530,6 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
autocomplete_state=AutocompleteState::CANCELED; autocomplete_state=AutocompleteState::CANCELED;
return false; return false;
}); });
do_delete_object.connect([this](){
if(delete_thread.joinable())
delete_thread.join();
delete this;
});
} }
void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { void Source::ClangViewAutocomplete::autocomplete_dialog_setup() {
@ -804,50 +798,6 @@ std::unordered_map<std::string, std::string> Source::ClangViewAutocomplete::auto
return map; 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<Gsv::Language> language) : Source::ClangViewRefactor::ClangViewRefactor(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language) :
Source::ClangViewParse(file_path, 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_highlight_syntax(true);
get_source_buffer()->set_language(language); 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() { void Source::ClangView::async_delete() {
dispatcher.disconnect(); dispatcher.disconnect();
delayed_reparse_connection.disconnect(); delayed_reparse_connection.disconnect();
delayed_tag_similar_identifiers_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();
});
} }

20
src/source_clang.h

@ -68,13 +68,10 @@ namespace Source {
}; };
ClangViewAutocomplete(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language); ClangViewAutocomplete(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language);
virtual void async_delete();
bool full_reparse() override;
protected: protected:
std::atomic<AutocompleteState> autocomplete_state;
std::thread autocomplete_thread; std::thread autocomplete_thread;
private: private:
std::atomic<AutocompleteState> autocomplete_state;
void autocomplete_dialog_setup(); void autocomplete_dialog_setup();
void autocomplete_check(); void autocomplete_check();
void autocomplete(); void autocomplete();
@ -84,11 +81,6 @@ namespace Source {
std::string prefix; std::string prefix;
std::mutex prefix_mutex; std::mutex prefix_mutex;
static std::unordered_map<std::string, std::string> autocomplete_manipulators_map(); static std::unordered_map<std::string, std::string> 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 { class ClangViewRefactor : public virtual ClangViewParse {
@ -125,7 +117,15 @@ namespace Source {
class ClangView : public ClangViewAutocomplete, public ClangViewRefactor { class ClangView : public ClangViewAutocomplete, public ClangViewRefactor {
public: public:
ClangView(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language); ClangView(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> 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;
}; };
} }

Loading…
Cancel
Save