summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2012-01-05 01:12:48 +0100
committerBen Noordhuis <info@bnoordhuis.nl>2012-01-06 00:45:27 +0100
commit1e73e4c62f14e8c68c284b20fd754523af63f157 (patch)
treecdb626426304461882f84fc6b5fe4b75db1eb2e4
parentdadc30318f812587405dd58d9a5d10ce392710b3 (diff)
downloadnode-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.cc4
-rw-r--r--src/node_isolate.cc63
-rw-r--r--src/node_isolate.h4
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_;