This patch gets rid of the global pio_registered_layers, by putting it
in interpreter data, creating and destroying the the layers in the
first interpreter and propgating his value to the child ones. This way
will solve threading issues (supposed that creating several main
interpreters is not valid).

-- 
Salu2
Index: src/io/io_layers.c
===================================================================
--- src/io/io_layers.c	(revisión: 28075)
+++ src/io/io_layers.c	(copia de trabajo)
@@ -177,11 +177,11 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 ParrotIOLayer *
-PIO_get_layer(SHIM_INTERP, ARGIN(const char *name))
+PIO_get_layer(PARROT_INTERP, ARGIN(const char *name))
 {
     ParrotIOLayer **t;
 
-    for (t = pio_registered_layers; *t; ++t)
+    for (t = interp->piolayers; *t; ++t)
         if (strcmp(name, (*t)->name) == 0)
             return *t;
     return NULL;
Index: src/io/io_private.h
===================================================================
--- src/io/io_private.h	(revisión: 28075)
+++ src/io/io_private.h	(copia de trabajo)
@@ -85,12 +85,6 @@
 #define PIO_DEFAULTMODE DEFAULT_OPEN_MODE
 #define PIO_UNBOUND     (size_t)-1
 
-/* This is list of valid layers */
-extern ParrotIOLayer **pio_registered_layers;
-
-/* This is the actual (default) layer stack which is used for IO */
-/* extern ParrotIOLayer *pio_default_stack; */
-
 typedef struct _ParrotIOBuf ParrotIOBuf;
 typedef PMC **ParrotIOTable;
 
Index: src/io/io.c
===================================================================
--- src/io/io.c	(revisión: 28075)
+++ src/io/io.c	(copia de trabajo)
@@ -36,15 +36,7 @@
 
 /* HEADERIZER HFILE: include/parrot/io.h */
 
-/* This is list of valid layers */
-ParrotIOLayer **pio_registered_layers = NULL;
-
-/* This is the default stack used for IO. Copy this to each new interp */
 /*
-ParrotIOLayer   * pio_default_stack;
-*/
-
-/*
         The standard streams are:
 
                 interp->piodata->table[PIO_STD*_FILENO].
@@ -375,10 +367,11 @@
 
 PARROT_API
 void
-PIO_internal_shutdown(SHIM_INTERP)
+PIO_internal_shutdown(PARROT_INTERP)
 {
-    mem_sys_free(pio_registered_layers);
-    pio_registered_layers = NULL;
+    PARROT_ASSERT(! interp->parent_interpreter);
+    mem_sys_free(interp->piolayers);
+    interp->piolayers = NULL;
 }
 
 /*
@@ -415,11 +408,17 @@
     PIO_push_layer(interp, PMCNULL, PIO_base_new_layer(&pio_buf_layer));
 
     fill = 0;
-    if (!pio_registered_layers) {
+    if (!interp->piolayers) {
         n = 5;  /* 2 default layers for now + utf8, mmap, string */
-        pio_registered_layers = (ParrotIOLayer **)mem_sys_allocate(
-                sizeof (ParrotIOLayer *) * (n + 1));
-        fill = 1;
+        if (interp->parent_interpreter) {
+            PARROT_ASSERT(interp->parent_interpreter->piolayers);
+            interp->piolayers = interp->parent_interpreter->piolayers;
+        }
+        else {
+            interp->piolayers = (ParrotIOLayer **)mem_sys_allocate(
+                    sizeof (ParrotIOLayer *) * (n + 1));
+            fill = 1;
+        }
     }
 
     /* Note: All layer pushes should be done before init calls */
@@ -427,8 +426,8 @@
         bottom = p;
         if (fill) {
             PARROT_ASSERT(i < n); /* XXX n can be undefined at this point. */
-            pio_registered_layers[i++] = p;
-            pio_registered_layers[i] = NULL;
+            interp->piolayers[i++] = p;
+            interp->piolayers[i] = NULL;
         }
     }
     /*
@@ -451,11 +450,11 @@
     }
     if (fill) {
         PARROT_ASSERT(i == 2);
-        PARROT_ASSERT(pio_registered_layers[2] == NULL);
-        pio_registered_layers[2] = PIO_utf8_register_layer();
-        pio_registered_layers[3] = PIO_mmap_register_layer();
-        pio_registered_layers[4] = PIO_string_register_layer();
-        pio_registered_layers[5] = NULL;
+        PARROT_ASSERT(interp->piolayers[2] == NULL);
+        interp->piolayers[2] = PIO_utf8_register_layer();
+        interp->piolayers[3] = PIO_mmap_register_layer();
+        interp->piolayers[4] = PIO_string_register_layer();
+        interp->piolayers[5] = NULL;
     }
 
     return 0;
Index: include/parrot/io.h
===================================================================
--- include/parrot/io.h	(revisión: 28075)
+++ include/parrot/io.h	(copia de trabajo)
@@ -264,7 +264,7 @@
         __attribute__nonnull__(1);
 
 PARROT_API
-void PIO_internal_shutdown(SHIM_INTERP);
+void PIO_internal_shutdown(PARROT_INTERP);
 
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
Index: include/parrot/interpreter.h
===================================================================
--- include/parrot/interpreter.h	(revisión: 28075)
+++ include/parrot/interpreter.h	(copia de trabajo)
@@ -309,6 +309,7 @@
     int    n_vtable_max;                      /* highest used type */
     int    n_vtable_alloced;                  /* alloced vtable space */
 
+    struct _ParrotIOLayer **piolayers;        /* IO registered layers */
     struct _ParrotIOData *piodata;            /* interpreter's IO system */
 
     op_lib_t  *op_lib;                        /* Opcode library */

Reply via email to