Skip to content

Commit

Permalink
src: use RAII for mutexes in node_watchdog.cc
Browse files Browse the repository at this point in the history
PR-URL: #7933
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
addaleax authored and cjihrig committed Aug 11, 2016
1 parent 14b762f commit fb8840c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 39 deletions.
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

0 comments on commit fb8840c

Please sign in to comment.