diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2012-01-05 01:12:48 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2012-01-06 00:45:27 +0100 |
commit | 1e73e4c62f14e8c68c284b20fd754523af63f157 (patch) | |
tree | cdb626426304461882f84fc6b5fe4b75db1eb2e4 | |
parent | dadc30318f812587405dd58d9a5d10ce392710b3 (diff) | |
download | node-1e73e4c62f14e8c68c284b20fd754523af63f157.tar.gz |
isolates: remove global isolates list
No longer necessary, each isolate now waits until its subordinate isolates have
exited.
-rw-r--r-- | src/node.cc | 4 | ||||
-rw-r--r-- | src/node_isolate.cc | 63 | ||||
-rw-r--r-- | src/node_isolate.h | 4 |
3 files changed, 14 insertions, 57 deletions
diff --git a/src/node.cc b/src/node.cc index 910199a09..b5283be0f 100644 --- a/src/node.cc +++ b/src/node.cc @@ -2709,10 +2709,6 @@ int Start(int argc, char *argv[]) { StartThread(isolate, argc, argv); isolate->Dispose(); - // The main thread/isolate is done. Wait for all other thread/isolates to - // finish. - node::Isolate::JoinAll(); - #ifndef NDEBUG // Clean up. V8::Dispose(); diff --git a/src/node_isolate.cc b/src/node_isolate.cc index 9c92a47a3..f6fab5680 100644 --- a/src/node_isolate.cc +++ b/src/node_isolate.cc @@ -53,9 +53,7 @@ using v8::Undefined; static volatile bool initialized; static volatile int id; static volatile int isolate_count; -static uv_mutex_t list_lock; -static ngx_queue_t list_head; - +static uv_mutex_t isolate_mutex; #ifdef NDEBUG # define IF_DEBUG(expr) @@ -217,39 +215,18 @@ void Isolate::OnMessage(IsolateMessage* msg, void* arg) { void Isolate::Initialize() { - if (!initialized) { - initialized = true; - if (uv_mutex_init(&list_lock)) abort(); - ngx_queue_init(&list_head); - } + if (initialized) return; + if (uv_mutex_init(&isolate_mutex)) abort(); + initialized = true; } int Isolate::Count() { - return isolate_count; -} - - -void Isolate::JoinAll() { - uv_mutex_lock(&list_lock); - - while (ngx_queue_empty(&list_head) == false) { - ngx_queue_t* q = ngx_queue_head(&list_head); - assert(q); - Isolate* isolate = ngx_queue_data(q, Isolate, list_member_); - assert(isolate); - - // Unlock the list while we join the thread. - uv_mutex_unlock(&list_lock); - - uv_thread_join(&isolate->tid_); - - // Relock to check the next element in the list. - uv_mutex_lock(&list_lock); - } - - // Unlock the list finally. - uv_mutex_unlock(&list_lock); + int count; + uv_mutex_lock(&isolate_mutex); + count = isolate_count; + uv_mutex_unlock(&isolate_mutex); + return count; } @@ -257,11 +234,11 @@ Isolate::Isolate() { send_channel_ = NULL; // set (and deleted) by the parent isolate recv_channel_ = NULL; - uv_mutex_lock(&list_lock); - + uv_mutex_lock(&isolate_mutex); assert(initialized && "node::Isolate::Initialize() hasn't been called"); - + isolate_count++; id_ = ++id; + uv_mutex_unlock(&isolate_mutex); if (id_ == 1) { loop_ = uv_default_loop(); @@ -271,14 +248,6 @@ Isolate::Isolate() { ngx_queue_init(&at_exit_callbacks_); - ngx_queue_init(&list_member_); - - // Add this isolate into the list of all isolates. - ngx_queue_insert_tail(&list_head, &list_member_); - isolate_count++; - - uv_mutex_unlock(&list_lock); - v8_isolate_ = v8::Isolate::New(); assert(v8_isolate_->GetData() == NULL); v8_isolate_->SetData(this); @@ -336,8 +305,6 @@ void Isolate::Exit() { void Isolate::Dispose() { - uv_mutex_lock(&list_lock); - NODE_ISOLATE_CHECK(this); while (!ngx_queue_empty(&at_exit_callbacks_)) { @@ -359,12 +326,10 @@ void Isolate::Dispose() { v8_isolate_->Dispose(); v8_isolate_ = NULL; - ngx_queue_remove(&list_member_); + uv_mutex_lock(&isolate_mutex); isolate_count--; assert(isolate_count >= 0); - assert(isolate_count > 0 || ngx_queue_empty(&list_head)); - - uv_mutex_unlock(&list_lock); + uv_mutex_unlock(&isolate_mutex); } diff --git a/src/node_isolate.h b/src/node_isolate.h index 18d7dce90..ccfc83433 100644 --- a/src/node_isolate.h +++ b/src/node_isolate.h @@ -58,7 +58,6 @@ public: typedef void (*AtExitCallback)(void* arg); - static void JoinAll(); static v8::Handle<v8::Value> Send(const v8::Arguments& args); static Isolate* GetCurrent() { @@ -121,9 +120,6 @@ private: IsolateChannel* recv_channel_; uv_loop_t* loop_; - // Each isolate is a member of the static list_head. - ngx_queue_t list_member_; - // Global variables for this isolate. struct globals globals_; bool globals_init_; |