@@ -167,6 +167,9 @@ using v8::Value;
167
167
168
168
using AsyncHooks = node::Environment::AsyncHooks;
169
169
170
+ static Mutex process_mutex;
171
+ static Mutex environ_mutex;
172
+
170
173
static bool print_eval = false ;
171
174
static bool force_repl = false ;
172
175
static bool syntax_check_only = false ;
@@ -1789,6 +1792,7 @@ void AppendExceptionLine(Environment* env,
1789
1792
if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
1790
1793
if (env->printed_error ())
1791
1794
return ;
1795
+ Mutex::ScopedLock lock (process_mutex);
1792
1796
env->set_printed_error (true );
1793
1797
1794
1798
uv_tty_reset_mode ();
@@ -2952,6 +2956,7 @@ static void LinkedBinding(const FunctionCallbackInfo<Value>& args) {
2952
2956
2953
2957
static void ProcessTitleGetter (Local<Name> property,
2954
2958
const PropertyCallbackInfo<Value>& info) {
2959
+ Mutex::ScopedLock lock (process_mutex);
2955
2960
char buffer[512 ];
2956
2961
uv_get_process_title (buffer, sizeof (buffer));
2957
2962
info.GetReturnValue ().Set (String::NewFromUtf8 (info.GetIsolate (), buffer));
@@ -2961,6 +2966,7 @@ static void ProcessTitleGetter(Local<Name> property,
2961
2966
static void ProcessTitleSetter (Local<Name> property,
2962
2967
Local<Value> value,
2963
2968
const PropertyCallbackInfo<void >& info) {
2969
+ Mutex::ScopedLock lock (process_mutex);
2964
2970
node::Utf8Value title (info.GetIsolate (), value);
2965
2971
// TODO(piscisaureus): protect with a lock
2966
2972
uv_set_process_title (*title);
@@ -2969,6 +2975,7 @@ static void ProcessTitleSetter(Local<Name> property,
2969
2975
2970
2976
static void EnvGetter (Local<Name> property,
2971
2977
const PropertyCallbackInfo<Value>& info) {
2978
+ Mutex::ScopedLock lock (environ_mutex);
2972
2979
Isolate* isolate = info.GetIsolate ();
2973
2980
if (property->IsSymbol ()) {
2974
2981
return info.GetReturnValue ().SetUndefined ();
@@ -3001,6 +3008,7 @@ static void EnvGetter(Local<Name> property,
3001
3008
static void EnvSetter (Local<Name> property,
3002
3009
Local<Value> value,
3003
3010
const PropertyCallbackInfo<Value>& info) {
3011
+ Mutex::ScopedLock lock (environ_mutex);
3004
3012
#ifdef __POSIX__
3005
3013
node::Utf8Value key (info.GetIsolate (), property);
3006
3014
node::Utf8Value val (info.GetIsolate (), value);
@@ -3021,6 +3029,7 @@ static void EnvSetter(Local<Name> property,
3021
3029
3022
3030
static void EnvQuery (Local<Name> property,
3023
3031
const PropertyCallbackInfo<Integer>& info) {
3032
+ Mutex::ScopedLock lock (environ_mutex);
3024
3033
int32_t rc = -1 ; // Not found unless proven otherwise.
3025
3034
if (property->IsString ()) {
3026
3035
#ifdef __POSIX__
@@ -3049,6 +3058,7 @@ static void EnvQuery(Local<Name> property,
3049
3058
3050
3059
static void EnvDeleter (Local<Name> property,
3051
3060
const PropertyCallbackInfo<Boolean >& info) {
3061
+ Mutex::ScopedLock lock (environ_mutex);
3052
3062
if (property->IsString ()) {
3053
3063
#ifdef __POSIX__
3054
3064
node::Utf8Value key (info.GetIsolate (), property);
@@ -3067,6 +3077,7 @@ static void EnvDeleter(Local<Name> property,
3067
3077
3068
3078
3069
3079
static void EnvEnumerator (const PropertyCallbackInfo<Array>& info) {
3080
+ Mutex::ScopedLock lock (environ_mutex);
3070
3081
Environment* env = Environment::GetCurrent (info);
3071
3082
Isolate* isolate = env->isolate ();
3072
3083
Local<Context> ctx = env->context ();
@@ -3190,6 +3201,7 @@ static Local<Object> GetFeatures(Environment* env) {
3190
3201
3191
3202
static void DebugPortGetter (Local<Name> property,
3192
3203
const PropertyCallbackInfo<Value>& info) {
3204
+ Mutex::ScopedLock lock (process_mutex);
3193
3205
int port = debug_options.port ();
3194
3206
#if HAVE_INSPECTOR
3195
3207
if (port == 0 ) {
@@ -3205,6 +3217,7 @@ static void DebugPortGetter(Local<Name> property,
3205
3217
static void DebugPortSetter (Local<Name> property,
3206
3218
Local<Value> value,
3207
3219
const PropertyCallbackInfo<void >& info) {
3220
+ Mutex::ScopedLock lock (process_mutex);
3208
3221
debug_options.set_port (value->Int32Value ());
3209
3222
}
3210
3223
0 commit comments