Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
isolates: remove global isolates list
Browse files Browse the repository at this point in the history
No longer necessary, each isolate now waits until its subordinate isolates have
exited.
  • Loading branch information
bnoordhuis committed Jan 5, 2012
1 parent dadc303 commit 1e73e4c
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 57 deletions.
4 changes: 0 additions & 4 deletions src/node.cc
Expand Up @@ -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();
Expand Down
63 changes: 14 additions & 49 deletions src/node_isolate.cc
Expand Up @@ -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)
Expand Down Expand Up @@ -217,51 +215,30 @@ 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;
}


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();
Expand All @@ -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);
Expand Down Expand Up @@ -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_)) {
Expand All @@ -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);
}


Expand Down
4 changes: 0 additions & 4 deletions src/node_isolate.h
Expand Up @@ -58,7 +58,6 @@ class Isolate {

typedef void (*AtExitCallback)(void* arg);

static void JoinAll();
static v8::Handle<v8::Value> Send(const v8::Arguments& args);

static Isolate* GetCurrent() {
Expand Down Expand Up @@ -121,9 +120,6 @@ class Isolate {
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_;
Expand Down

5 comments on commit 1e73e4c

@koichik
Copy link

@koichik koichik commented on 1e73e4c Jan 9, 2012

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I want to iterate all Isolates to implement #2395. Any chance?

@bnoordhuis
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I'm not particularly sold on the implementation but revert this commit if you want.

@koichik
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Ben, please revert. Actually, I need only the isolates list. JoinAll() is not necessary to me.

@bnoordhuis
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's back: 7cee968

@koichik
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

Please sign in to comment.