@@ -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 ;
@@ -1792,6 +1795,7 @@ void AppendExceptionLine(Environment* env,
1792
1795
if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
1793
1796
if (env->printed_error ())
1794
1797
return ;
1798
+ Mutex::ScopedLock lock (process_mutex);
1795
1799
env->set_printed_error (true );
1796
1800
1797
1801
uv_tty_reset_mode ();
@@ -2955,6 +2959,7 @@ static void LinkedBinding(const FunctionCallbackInfo<Value>& args) {
2955
2959
2956
2960
static void ProcessTitleGetter (Local<Name> property,
2957
2961
const PropertyCallbackInfo<Value>& info) {
2962
+ Mutex::ScopedLock lock (process_mutex);
2958
2963
char buffer[512 ];
2959
2964
uv_get_process_title (buffer, sizeof (buffer));
2960
2965
info.GetReturnValue ().Set (String::NewFromUtf8 (info.GetIsolate (), buffer));
@@ -2964,6 +2969,7 @@ static void ProcessTitleGetter(Local<Name> property,
2964
2969
static void ProcessTitleSetter (Local<Name> property,
2965
2970
Local<Value> value,
2966
2971
const PropertyCallbackInfo<void >& info) {
2972
+ Mutex::ScopedLock lock (process_mutex);
2967
2973
node::Utf8Value title (info.GetIsolate (), value);
2968
2974
// TODO(piscisaureus): protect with a lock
2969
2975
uv_set_process_title (*title);
@@ -2972,6 +2978,7 @@ static void ProcessTitleSetter(Local<Name> property,
2972
2978
2973
2979
static void EnvGetter (Local<Name> property,
2974
2980
const PropertyCallbackInfo<Value>& info) {
2981
+ Mutex::ScopedLock lock (environ_mutex);
2975
2982
Isolate* isolate = info.GetIsolate ();
2976
2983
if (property->IsSymbol ()) {
2977
2984
return info.GetReturnValue ().SetUndefined ();
@@ -3004,6 +3011,7 @@ static void EnvGetter(Local<Name> property,
3004
3011
static void EnvSetter (Local<Name> property,
3005
3012
Local<Value> value,
3006
3013
const PropertyCallbackInfo<Value>& info) {
3014
+ Mutex::ScopedLock lock (environ_mutex);
3007
3015
#ifdef __POSIX__
3008
3016
node::Utf8Value key (info.GetIsolate (), property);
3009
3017
node::Utf8Value val (info.GetIsolate (), value);
@@ -3024,6 +3032,7 @@ static void EnvSetter(Local<Name> property,
3024
3032
3025
3033
static void EnvQuery (Local<Name> property,
3026
3034
const PropertyCallbackInfo<Integer>& info) {
3035
+ Mutex::ScopedLock lock (environ_mutex);
3027
3036
int32_t rc = -1 ; // Not found unless proven otherwise.
3028
3037
if (property->IsString ()) {
3029
3038
#ifdef __POSIX__
@@ -3052,6 +3061,7 @@ static void EnvQuery(Local<Name> property,
3052
3061
3053
3062
static void EnvDeleter (Local<Name> property,
3054
3063
const PropertyCallbackInfo<Boolean >& info) {
3064
+ Mutex::ScopedLock lock (environ_mutex);
3055
3065
if (property->IsString ()) {
3056
3066
#ifdef __POSIX__
3057
3067
node::Utf8Value key (info.GetIsolate (), property);
@@ -3070,6 +3080,7 @@ static void EnvDeleter(Local<Name> property,
3070
3080
3071
3081
3072
3082
static void EnvEnumerator (const PropertyCallbackInfo<Array>& info) {
3083
+ Mutex::ScopedLock lock (environ_mutex);
3073
3084
Environment* env = Environment::GetCurrent (info);
3074
3085
Isolate* isolate = env->isolate ();
3075
3086
Local<Context> ctx = env->context ();
@@ -3193,6 +3204,7 @@ static Local<Object> GetFeatures(Environment* env) {
3193
3204
3194
3205
static void DebugPortGetter (Local<Name> property,
3195
3206
const PropertyCallbackInfo<Value>& info) {
3207
+ Mutex::ScopedLock lock (process_mutex);
3196
3208
int port = debug_options.port ();
3197
3209
#if HAVE_INSPECTOR
3198
3210
if (port == 0 ) {
@@ -3208,6 +3220,7 @@ static void DebugPortGetter(Local<Name> property,
3208
3220
static void DebugPortSetter (Local<Name> property,
3209
3221
Local<Value> value,
3210
3222
const PropertyCallbackInfo<void >& info) {
3223
+ Mutex::ScopedLock lock (process_mutex);
3211
3224
debug_options.set_port (value->Int32Value ());
3212
3225
}
3213
3226
0 commit comments