about summary refs log tree commit diff
path: root/src/rt/rust_env.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-05-08 15:26:07 -0700
committerBrian Anderson <banderson@mozilla.com>2013-05-15 12:19:14 -0700
commitf6401bad24d2fb1e1f959595c2f57cb4964e7082 (patch)
treeb8f1043af856875b64df032de0d82f39ba025c74 /src/rt/rust_env.cpp
parent36ad366519137122871b04b407370dab4a97c645 (diff)
downloadrust-f6401bad24d2fb1e1f959595c2f57cb4964e7082.tar.gz
rust-f6401bad24d2fb1e1f959595c2f57cb4964e7082.zip
core: Use a global lock instead of runtime lock for os::getenv, etc. #4726
Diffstat (limited to 'src/rt/rust_env.cpp')
-rw-r--r--src/rt/rust_env.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/rt/rust_env.cpp b/src/rt/rust_env.cpp
index 360d6114928..ed38be3550f 100644
--- a/src/rt/rust_env.cpp
+++ b/src/rt/rust_env.cpp
@@ -13,6 +13,7 @@
 // that might come from the environment is loaded here, once, during
 // init.
 
+#include "sync/lock_and_signal.h"
 #include "rust_env.h"
 
 // The environment variables that the runtime knows about
@@ -26,6 +27,18 @@
 #define RUST_DEBUG_MEM "RUST_DEBUG_MEM"
 #define RUST_DEBUG_BORROW "RUST_DEBUG_BORROW"
 
+static lock_and_signal env_lock;
+
+extern "C" CDECL void
+rust_take_env_lock() {
+    env_lock.lock();
+}
+
+extern "C" CDECL void
+rust_drop_env_lock() {
+    env_lock.unlock();
+}
+
 #if defined(__WIN32__)
 static int
 get_num_cpus() {
@@ -119,6 +132,8 @@ copyenv(const char* name) {
 
 rust_env*
 load_env(int argc, char **argv) {
+    scoped_lock with(env_lock);
+
     rust_env *env = (rust_env*)malloc(sizeof(rust_env));
 
     env->num_sched_threads = (size_t)get_num_threads();
@@ -141,3 +156,4 @@ free_env(rust_env *env) {
     free(env->rust_seed);
     free(env);
 }
+