@@ -167,6 +167,9 @@ using v8::Value;
167167
168168using AsyncHooks = node::Environment::AsyncHooks;
169169
170+ static Mutex process_mutex;
171+ static Mutex environ_mutex;
172+
170173static bool print_eval = false ;
171174static bool force_repl = false ;
172175static bool syntax_check_only = false ;
@@ -1789,6 +1792,7 @@ void AppendExceptionLine(Environment* env,
17891792 if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
17901793 if (env->printed_error ())
17911794 return ;
1795+ Mutex::ScopedLock lock (process_mutex);
17921796 env->set_printed_error (true );
17931797
17941798 uv_tty_reset_mode ();
@@ -2952,6 +2956,7 @@ static void LinkedBinding(const FunctionCallbackInfo<Value>& args) {
29522956
29532957static void ProcessTitleGetter (Local<Name> property,
29542958 const PropertyCallbackInfo<Value>& info) {
2959+ Mutex::ScopedLock lock (process_mutex);
29552960 char buffer[512 ];
29562961 uv_get_process_title (buffer, sizeof (buffer));
29572962 info.GetReturnValue ().Set (String::NewFromUtf8 (info.GetIsolate (), buffer));
@@ -2961,6 +2966,7 @@ static void ProcessTitleGetter(Local<Name> property,
29612966static void ProcessTitleSetter (Local<Name> property,
29622967 Local<Value> value,
29632968 const PropertyCallbackInfo<void >& info) {
2969+ Mutex::ScopedLock lock (process_mutex);
29642970 node::Utf8Value title (info.GetIsolate (), value);
29652971 // TODO(piscisaureus): protect with a lock
29662972 uv_set_process_title (*title);
@@ -2969,6 +2975,7 @@ static void ProcessTitleSetter(Local<Name> property,
29692975
29702976static void EnvGetter (Local<Name> property,
29712977 const PropertyCallbackInfo<Value>& info) {
2978+ Mutex::ScopedLock lock (environ_mutex);
29722979 Isolate* isolate = info.GetIsolate ();
29732980 if (property->IsSymbol ()) {
29742981 return info.GetReturnValue ().SetUndefined ();
@@ -3001,6 +3008,7 @@ static void EnvGetter(Local<Name> property,
30013008static void EnvSetter (Local<Name> property,
30023009 Local<Value> value,
30033010 const PropertyCallbackInfo<Value>& info) {
3011+ Mutex::ScopedLock lock (environ_mutex);
30043012#ifdef __POSIX__
30053013 node::Utf8Value key (info.GetIsolate (), property);
30063014 node::Utf8Value val (info.GetIsolate (), value);
@@ -3021,6 +3029,7 @@ static void EnvSetter(Local<Name> property,
30213029
30223030static void EnvQuery (Local<Name> property,
30233031 const PropertyCallbackInfo<Integer>& info) {
3032+ Mutex::ScopedLock lock (environ_mutex);
30243033 int32_t rc = -1 ; // Not found unless proven otherwise.
30253034 if (property->IsString ()) {
30263035#ifdef __POSIX__
@@ -3049,6 +3058,7 @@ static void EnvQuery(Local<Name> property,
30493058
30503059static void EnvDeleter (Local<Name> property,
30513060 const PropertyCallbackInfo<Boolean>& info) {
3061+ Mutex::ScopedLock lock (environ_mutex);
30523062 if (property->IsString ()) {
30533063#ifdef __POSIX__
30543064 node::Utf8Value key (info.GetIsolate (), property);
@@ -3067,6 +3077,7 @@ static void EnvDeleter(Local<Name> property,
30673077
30683078
30693079static void EnvEnumerator (const PropertyCallbackInfo<Array>& info) {
3080+ Mutex::ScopedLock lock (environ_mutex);
30703081 Environment* env = Environment::GetCurrent (info);
30713082 Isolate* isolate = env->isolate ();
30723083 Local<Context> ctx = env->context ();
@@ -3190,6 +3201,7 @@ static Local<Object> GetFeatures(Environment* env) {
31903201
31913202static void DebugPortGetter (Local<Name> property,
31923203 const PropertyCallbackInfo<Value>& info) {
3204+ Mutex::ScopedLock lock (process_mutex);
31933205 int port = debug_options.port ();
31943206#if HAVE_INSPECTOR
31953207 if (port == 0 ) {
@@ -3205,6 +3217,7 @@ static void DebugPortGetter(Local<Name> property,
32053217static void DebugPortSetter (Local<Name> property,
32063218 Local<Value> value,
32073219 const PropertyCallbackInfo<void >& info) {
3220+ Mutex::ScopedLock lock (process_mutex);
32083221 debug_options.set_port (value->Int32Value ());
32093222}
32103223
0 commit comments