Browse Source

Further mutex cleanup

merge-requests/365/head
eidheim 10 years ago
parent
commit
c1edb29d02
  1. 12
      src/debug_clang.cc
  2. 7
      src/dispatcher.cc
  3. 37
      src/terminal.cc
  4. 3
      src/terminal.h

12
src/debug_clang.cc

@ -428,24 +428,18 @@ std::string Debug::Clang::get_return_value(const boost::filesystem::path &file_p
} }
bool Debug::Clang::is_invalid() { bool Debug::Clang::is_invalid() {
bool invalid;
std::unique_lock<std::mutex> lock(event_mutex); std::unique_lock<std::mutex> lock(event_mutex);
invalid=state==lldb::StateType::eStateInvalid; return state==lldb::StateType::eStateInvalid;
return invalid;
} }
bool Debug::Clang::is_stopped() { bool Debug::Clang::is_stopped() {
bool stopped;
std::unique_lock<std::mutex> lock(event_mutex); std::unique_lock<std::mutex> lock(event_mutex);
stopped=state==lldb::StateType::eStateStopped; return state==lldb::StateType::eStateStopped;
return stopped;
} }
bool Debug::Clang::is_running() { bool Debug::Clang::is_running() {
bool running;
std::unique_lock<std::mutex> lock(event_mutex); std::unique_lock<std::mutex> lock(event_mutex);
running=state==lldb::StateType::eStateRunning; return state==lldb::StateType::eStateRunning;
return running;
} }
void Debug::Clang::add_breakpoint(const boost::filesystem::path &file_path, int line_nr) { void Debug::Clang::add_breakpoint(const boost::filesystem::path &file_path, int line_nr) {

7
src/dispatcher.cc

@ -17,9 +17,10 @@ Dispatcher::~Dispatcher() {
} }
void Dispatcher::post(std::function<void()> &&function) { void Dispatcher::post(std::function<void()> &&function) {
std::unique_lock<std::mutex> lock(functions_mutex); {
functions.emplace_back(function); std::unique_lock<std::mutex> lock(functions_mutex);
lock.unlock(); functions.emplace_back(function);
}
dispatcher(); dispatcher();
} }

37
src/terminal.cc

@ -9,10 +9,7 @@ Terminal::InProgress::InProgress(const std::string& start_msg): stop(false) {
} }
Terminal::InProgress::~InProgress() { Terminal::InProgress::~InProgress() {
{ stop=true;
std::unique_lock<std::mutex> lock(stop_mutex);
stop=true;
}
if(wait_thread.joinable()) if(wait_thread.joinable())
wait_thread.join(); wait_thread.join();
} }
@ -21,12 +18,7 @@ void Terminal::InProgress::start(const std::string& msg) {
line_nr=Terminal::get().print(msg+"...\n"); line_nr=Terminal::get().print(msg+"...\n");
wait_thread=std::thread([this](){ wait_thread=std::thread([this](){
size_t c=0; size_t c=0;
while(true) { while(!stop) {
{
std::unique_lock<std::mutex> lock(stop_mutex);
if(stop)
break;
}
if(c%100==0) if(c%100==0)
Terminal::get().async_print(line_nr-1, "."); Terminal::get().async_print(line_nr-1, ".");
std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::sleep_for(std::chrono::milliseconds(10));
@ -36,21 +28,15 @@ void Terminal::InProgress::start(const std::string& msg) {
} }
void Terminal::InProgress::done(const std::string& msg) { void Terminal::InProgress::done(const std::string& msg) {
std::unique_lock<std::mutex> lock(stop_mutex); bool expected=false;
if(!stop) { if(stop.compare_exchange_strong(expected, true))
stop=true;
lock.unlock();
Terminal::get().async_print(line_nr-1, msg); Terminal::get().async_print(line_nr-1, msg);
}
} }
void Terminal::InProgress::cancel(const std::string& msg) { void Terminal::InProgress::cancel(const std::string& msg) {
std::unique_lock<std::mutex> lock(stop_mutex); bool expected=false;
if(!stop) { if(stop.compare_exchange_strong(expected, true))
stop=true;
lock.unlock();
Terminal::get().async_print(line_nr-1, msg); Terminal::get().async_print(line_nr-1, msg);
}
} }
Terminal::Terminal() { Terminal::Terminal() {
@ -135,7 +121,7 @@ void Terminal::async_process(const std::string &command, const boost::filesystem
auto exit_status=process->get_exit_status(); auto exit_status=process->get_exit_status();
processes_lock = std::unique_lock<std::mutex>(processes_mutex); processes_lock.lock();
for(auto it=processes.begin();it!=processes.end();it++) { for(auto it=processes.begin();it!=processes.end();it++) {
if((*it)->get_id()==pid) { if((*it)->get_id()==pid) {
processes.erase(it); processes.erase(it);
@ -272,12 +258,11 @@ void Terminal::configure() {
} }
void Terminal::clear() { void Terminal::clear() {
std::unique_lock<std::mutex> lock(in_progresses_mutex); {
for(auto &in_progress: in_progresses) { std::unique_lock<std::mutex> lock(in_progresses_mutex);
std::unique_lock<std::mutex> stop_lock(in_progress->stop_mutex); for(auto &in_progress: in_progresses)
in_progress->stop=true; in_progress->stop=true;
} }
lock.unlock();
while(g_main_context_pending(NULL)) while(g_main_context_pending(NULL))
g_main_context_iteration(NULL, false); g_main_context_iteration(NULL, false);
get_buffer()->set_text(""); get_buffer()->set_text("");

3
src/terminal.h

@ -25,8 +25,7 @@ public:
void start(const std::string& msg); void start(const std::string& msg);
size_t line_nr; size_t line_nr;
bool stop; std::atomic<bool> stop;
std::mutex stop_mutex;
std::thread wait_thread; std::thread wait_thread;
}; };

Loading…
Cancel
Save