isolates have globals stored in struct globals
authorRyan Dahl <ry@tinyclouds.org>
Fri, 9 Dec 2011 06:44:10 +0000 (22:44 -0800)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 29 Dec 2011 00:56:09 +0000 (01:56 +0100)
src/node_isolate.cc
src/node_isolate.h
src/node_vars.cc
src/node_vars.h

index 808a872..50d6ded 100644 (file)
@@ -46,6 +46,13 @@ Isolate::Isolate(uv_loop_t* loop) {
 
   assert(isolate_->GetData() == NULL);
   isolate_->SetData(this);
+
+  globals_init(&globals_);
+}
+
+
+struct globals* Isolate::Globals() {
+  return &globals_;
 }
 
 
index 415f695..5fe8db9 100644 (file)
@@ -25,6 +25,7 @@
 #include "queue.h"
 #include "v8.h"
 #include "uv.h"
+#include "node_vars.h"
 
 #ifdef NDEBUG
 # define NODE_ISOLATE_CHECK(ptr) ((void) (ptr))
@@ -69,6 +70,8 @@ public:
   /* Shutdown the isolate. Call this method at thread death. */
   void Dispose();
 
+  struct globals* Globals();
+
 private:
   Isolate(uv_loop_t* loop);
 
@@ -81,6 +84,9 @@ private:
   SLIST_HEAD(AtExitCallbacks, AtExitCallbackInfo) at_exit_callbacks_;
   v8::Isolate* isolate_;
   uv_loop_t* loop_;
+
+  // Global variables for this isolate.
+  struct globals globals_;
 };
 
 } // namespace node
index 2871804..e462752 100644 (file)
@@ -1,4 +1,5 @@
 #include <node_vars.h>
+#include <node_isolate.h>
 #if HAVE_OPENSSL
 # include <node_crypto.h>
 #endif
@@ -9,11 +10,7 @@ namespace node {
 // For now we just statically initialize the globals structure. Later there
 // will be one struct globals for each isolate.
 
-static struct globals g_struct;
-static struct globals* g_ptr;
-
-
-static void globals_init(struct globals* g) {
+void globals_init(struct globals* g) {
   memset(g, 0, sizeof(struct globals));
   g->debug_port = 5858;
 
@@ -31,6 +28,15 @@ static void globals_init(struct globals* g) {
 }
 
 
+#if HAVE_ISOLATES
+struct globals* globals_get() {
+  node::Isolate* isolate = node::Isolate::GetCurrent();
+  return isolate->Globals();
+}
+#else
+static struct globals g_struct;
+static struct globals* g_ptr;
+
 struct globals* globals_get() {
   if (!g_ptr) {
     g_ptr = &g_struct;
@@ -38,5 +44,6 @@ struct globals* globals_get() {
   }
   return g_ptr;
 }
+#endif  // HAVE_ISOLATES
 
 }  // namespace node
index 9b2dd8e..f124148 100644 (file)
@@ -183,6 +183,11 @@ struct globals {
   ::ares_channel ares_channel;
 };
 
+// Initialize globals struct.
+void globals_init(struct globals*);
+
+// Get the globals struct for the current Isolate. The returned pointer is
+// already initialized.
 struct globals* globals_get();
 
 }  // namespace node