@@ -171,6 +171,9 @@ using v8::Value;
171
171
172
172
using AsyncHooks = Environment::AsyncHooks;
173
173
174
+ static Mutex process_mutex;
175
+ static Mutex environ_mutex;
176
+
174
177
static bool print_eval = false ;
175
178
static bool force_repl = false ;
176
179
static bool syntax_check_only = false ;
@@ -698,9 +701,12 @@ bool SafeGetenv(const char* key, std::string* text) {
698
701
goto fail;
699
702
#endif
700
703
701
- if (const char * value = getenv (key)) {
702
- *text = value;
703
- return true ;
704
+ {
705
+ Mutex::ScopedLock lock (environ_mutex);
706
+ if (const char * value = getenv (key)) {
707
+ *text = value;
708
+ return true ;
709
+ }
704
710
}
705
711
706
712
fail:
@@ -1358,6 +1364,7 @@ void AppendExceptionLine(Environment* env,
1358
1364
if (!can_set_arrow || (mode == FATAL_ERROR && !err_obj->IsNativeError ())) {
1359
1365
if (env->printed_error ())
1360
1366
return ;
1367
+ Mutex::ScopedLock lock (process_mutex);
1361
1368
env->set_printed_error (true );
1362
1369
1363
1370
uv_tty_reset_mode ();
@@ -2624,7 +2631,6 @@ static void ProcessTitleSetter(Local<Name> property,
2624
2631
Local<Value> value,
2625
2632
const PropertyCallbackInfo<void >& info) {
2626
2633
node::Utf8Value title (info.GetIsolate (), value);
2627
- // TODO(piscisaureus): protect with a lock
2628
2634
uv_set_process_title (*title);
2629
2635
}
2630
2636
@@ -2635,6 +2641,7 @@ static void EnvGetter(Local<Name> property,
2635
2641
if (property->IsSymbol ()) {
2636
2642
return info.GetReturnValue ().SetUndefined ();
2637
2643
}
2644
+ Mutex::ScopedLock lock (environ_mutex);
2638
2645
#ifdef __POSIX__
2639
2646
node::Utf8Value key (isolate, property);
2640
2647
const char * val = getenv (*key);
@@ -2675,6 +2682,8 @@ static void EnvSetter(Local<Name> property,
2675
2682
" DEP0104" ).IsNothing ())
2676
2683
return ;
2677
2684
}
2685
+
2686
+ Mutex::ScopedLock lock (environ_mutex);
2678
2687
#ifdef __POSIX__
2679
2688
node::Utf8Value key (info.GetIsolate (), property);
2680
2689
node::Utf8Value val (info.GetIsolate (), value);
@@ -2695,6 +2704,7 @@ static void EnvSetter(Local<Name> property,
2695
2704
2696
2705
static void EnvQuery (Local<Name> property,
2697
2706
const PropertyCallbackInfo<Integer>& info) {
2707
+ Mutex::ScopedLock lock (environ_mutex);
2698
2708
int32_t rc = -1 ; // Not found unless proven otherwise.
2699
2709
if (property->IsString ()) {
2700
2710
#ifdef __POSIX__
@@ -2724,6 +2734,7 @@ static void EnvQuery(Local<Name> property,
2724
2734
2725
2735
static void EnvDeleter (Local<Name> property,
2726
2736
const PropertyCallbackInfo<Boolean>& info) {
2737
+ Mutex::ScopedLock lock (environ_mutex);
2727
2738
if (property->IsString ()) {
2728
2739
#ifdef __POSIX__
2729
2740
node::Utf8Value key (info.GetIsolate (), property);
@@ -2749,6 +2760,7 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
2749
2760
Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX];
2750
2761
size_t idx = 0 ;
2751
2762
2763
+ Mutex::ScopedLock lock (environ_mutex);
2752
2764
#ifdef __POSIX__
2753
2765
int size = 0 ;
2754
2766
while (environ[size])
@@ -2864,6 +2876,7 @@ static Local<Object> GetFeatures(Environment* env) {
2864
2876
2865
2877
static void DebugPortGetter (Local<Name> property,
2866
2878
const PropertyCallbackInfo<Value>& info) {
2879
+ Mutex::ScopedLock lock (process_mutex);
2867
2880
int port = debug_options.port ();
2868
2881
#if HAVE_INSPECTOR
2869
2882
if (port == 0 ) {
@@ -2879,6 +2892,7 @@ static void DebugPortGetter(Local<Name> property,
2879
2892
static void DebugPortSetter (Local<Name> property,
2880
2893
Local<Value> value,
2881
2894
const PropertyCallbackInfo<void >& info) {
2895
+ Mutex::ScopedLock lock (process_mutex);
2882
2896
debug_options.set_port (value->Int32Value ());
2883
2897
}
2884
2898
0 commit comments