mirror of https://github.com/lukechilds/node.git
Browse Source
Before this commit, sending a SIGUSR1 at program exit could trigger a hard to reproduce race condition where `v8::Debug::DebugBreak(isolate)` got called when the isolate was in the process of being torn down. A similar race condition is in theory possible when sending signals to two threads simultaneously but I haven't been able to reproduce that myself (and I tried, oh how I tried.) This commit fixes the race condition by turning `node_isolate` into a `std::atomic` and using it as an ad hoc synchronization primitive in places where that is necessary. A bare minimum std::atomic polyfill is added for OS X because Apple wouldn't be Apple if things just worked out of the box. PR-URL: https://github.com/nodejs/node/pull/3528 Reviewed-By: Fedor Indutny <fedor@indutny.com> Reviewed-By: James M Snell <jasnell@gmail.com>v5.x
Ben Noordhuis
9 years ago
committed by
Rod Vagg
2 changed files with 60 additions and 13 deletions
@ -0,0 +1,18 @@ |
|||
#ifndef SRC_ATOMIC_POLYFILL_H_ |
|||
#define SRC_ATOMIC_POLYFILL_H_ |
|||
|
|||
#include "util.h" |
|||
|
|||
namespace nonstd { |
|||
|
|||
template <typename T> |
|||
struct atomic { |
|||
atomic() = default; |
|||
T exchange(T value) { return __sync_lock_test_and_set(&value_, value); } |
|||
T value_ = T(); |
|||
DISALLOW_COPY_AND_ASSIGN(atomic); |
|||
}; |
|||
|
|||
} // namespace nonstd
|
|||
|
|||
#endif // SRC_ATOMIC_POLYFILL_H_
|
Loading…
Reference in new issue