Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
src: use RAII for mutexes in node_watchdog.cc
  • Loading branch information
addaleax committed Aug 1, 2016
commit 5e3538ba1582086e75702b78cc7521ceac09c264
62 changes: 25 additions & 37 deletions src/node_watchdog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ BOOL WINAPI SigintWatchdogHelper::WinCtrlCHandlerRoutine(DWORD dwCtrlType) {


bool SigintWatchdogHelper::InformWatchdogsAboutSignal() {
uv_mutex_lock(&instance.list_mutex_);
Mutex::ScopedLock list_lock(instance.list_mutex_);

bool is_stopping = false;
#ifdef __POSIX__
Expand All @@ -176,17 +176,15 @@ bool SigintWatchdogHelper::InformWatchdogsAboutSignal() {
for (auto it : instance.watchdogs_)
it->HandleSigint();

uv_mutex_unlock(&instance.list_mutex_);
return is_stopping;
}


int SigintWatchdogHelper::Start() {
int ret = 0;
uv_mutex_lock(&mutex_);
Mutex::ScopedLock lock(mutex_);

if (start_stop_count_++ > 0) {
goto dont_start;
return 0;
}

#ifdef __POSIX__
Expand All @@ -197,10 +195,10 @@ int SigintWatchdogHelper::Start() {
sigset_t sigmask;
sigfillset(&sigmask);
CHECK_EQ(0, pthread_sigmask(SIG_SETMASK, &sigmask, &sigmask));
ret = pthread_create(&thread_, nullptr, RunSigintWatchdog, nullptr);
int ret = pthread_create(&thread_, nullptr, RunSigintWatchdog, nullptr);
CHECK_EQ(0, pthread_sigmask(SIG_SETMASK, &sigmask, nullptr));
if (ret != 0) {
goto dont_start;
return ret;
}
has_running_thread_ = true;

Expand All @@ -209,34 +207,36 @@ int SigintWatchdogHelper::Start() {
SetConsoleCtrlHandler(WinCtrlCHandlerRoutine, TRUE);
#endif

dont_start:
uv_mutex_unlock(&mutex_);
return ret;
return 0;
}


bool SigintWatchdogHelper::Stop() {
uv_mutex_lock(&mutex_);
uv_mutex_lock(&list_mutex_);
bool had_pending_signal;
Mutex::ScopedLock lock(mutex_);

bool had_pending_signal = has_pending_signal_;
{
Mutex::ScopedLock list_lock(list_mutex_);

if (--start_stop_count_ > 0) {
uv_mutex_unlock(&list_mutex_);
goto dont_stop;
}
had_pending_signal = has_pending_signal_;

if (--start_stop_count_ > 0) {
has_pending_signal_ = false;
return had_pending_signal;
}

#ifdef __POSIX__
// Set stopping now because it's only protected by list_mutex_.
stopping_ = true;
// Set stopping now because it's only protected by list_mutex_.
stopping_ = true;
#endif

watchdogs_.clear();
uv_mutex_unlock(&list_mutex_);
watchdogs_.clear();
}

#ifdef __POSIX__
if (!has_running_thread_) {
goto dont_stop;
has_pending_signal_ = false;
return had_pending_signal;
}

// Wake up the helper thread.
Expand All @@ -252,32 +252,26 @@ bool SigintWatchdogHelper::Stop() {
#endif

had_pending_signal = has_pending_signal_;
dont_stop:
uv_mutex_unlock(&mutex_);

has_pending_signal_ = false;

return had_pending_signal;
}


void SigintWatchdogHelper::Register(SigintWatchdog* wd) {
uv_mutex_lock(&list_mutex_);
Mutex::ScopedLock lock(list_mutex_);

watchdogs_.push_back(wd);

uv_mutex_unlock(&list_mutex_);
}


void SigintWatchdogHelper::Unregister(SigintWatchdog* wd) {
uv_mutex_lock(&list_mutex_);
Mutex::ScopedLock lock(list_mutex_);

auto it = std::find(watchdogs_.begin(), watchdogs_.end(), wd);

CHECK_NE(it, watchdogs_.end());
watchdogs_.erase(it);

uv_mutex_unlock(&list_mutex_);
}


Expand All @@ -289,9 +283,6 @@ SigintWatchdogHelper::SigintWatchdogHelper()
stopping_ = false;
CHECK_EQ(0, uv_sem_init(&sem_, 0));
#endif

CHECK_EQ(0, uv_mutex_init(&mutex_));
CHECK_EQ(0, uv_mutex_init(&list_mutex_));
}


Expand All @@ -303,9 +294,6 @@ SigintWatchdogHelper::~SigintWatchdogHelper() {
CHECK_EQ(has_running_thread_, false);
uv_sem_destroy(&sem_);
#endif

uv_mutex_destroy(&mutex_);
uv_mutex_destroy(&list_mutex_);
}

SigintWatchdogHelper SigintWatchdogHelper::instance;
Expand Down
5 changes: 3 additions & 2 deletions src/node_watchdog.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "v8.h"
#include "uv.h"
#include "node_mutex.h"
#include <vector>

#ifdef __POSIX__
Expand Down Expand Up @@ -75,8 +76,8 @@ class SigintWatchdogHelper {

int start_stop_count_;

uv_mutex_t mutex_;
uv_mutex_t list_mutex_;
Mutex mutex_;
Mutex list_mutex_;
std::vector<SigintWatchdog*> watchdogs_;
bool has_pending_signal_;

Expand Down