This fixes the freeze by only initializing ParrotIO once. Also added
a little sanity check in the layer push sub. This is just a kludge, I'll work
on per Interpreter IO stack when we discuss it a little more.

-Melvin


--- io.c.orig   Tue Jan  1 21:54:35 2002
+++ io.c        Tue Jan  1 21:53:29 2002
@@ -70,9 +70,14 @@
  /*
   * Initialize some stuff.
   */
+INTVAL pio_initialized;
+
  void PIO_init(theINTERP) {
          int err;

+        if( pio_initialized != 0 )
+                return;
+
          /* Init IO stacks before creating any handles */
          if((err = PIO_init_stacks(interpreter)) != 0) {
                  abort();
@@ -101,6 +106,7 @@
   */
  INTVAL PIO_init_stacks(theINTERP) {
          ParrotIOLayer * p;
+
          PIO_push_layer(&pio_os_layer, NULL);
          /*PIO_push_layer(&pio_stdio_layer, NULL);*/

@@ -117,6 +123,8 @@
                          }
                  }
          }
+
+        pio_initialized = 1;
          return 0;
  }

@@ -166,6 +174,7 @@
   * Push a layer onto an IO object or the default stack
   */
  INTVAL PIO_push_layer(ParrotIOLayer * layer, ParrotIO * io) {
+        ParrotIOLayer * t;
          if( !layer )
                  return -1;
          if( io ) {
@@ -174,6 +183,16 @@
                          /* Error( 1st layer must be terminal) */
                          return -1;
                  }
+                /* Check and see if this layer already is on stack
+                 * This is a internals sanity check not a user level
+                 * check, at least until I fix copy-on-write stacks.
+                 * -Melvin
+                 */
+                for(t=io->stack; t; t=t->down) {
+                        if( t == layer )
+                                return -1;
+                }
+
                  layer->down = io->stack;
                  if( io->stack )
                          io->stack->up = layer;
@@ -186,6 +205,12 @@
                          /* Error( 1st layer must be terminal) */
                          return -1;
                  }
+                /* Sanity check */
+                for(t=pio_default_stack; t; t=t->down) {
+                        if( t == layer )
+                                return -1;
+                }
+
                  layer->down = pio_default_stack;
                  if( pio_default_stack )
                          pio_default_stack->up = layer;
@@ -319,8 +344,7 @@
                  while(l) {
                          if(l->api->Close) {
                                  PIO_flush(interpreter, io);
-                                (*l->api->Close)(interpreter, l, io);
-                                return;
+                                return (*l->api->Close)(interpreter,l,io);
                          }
                          l = PIO_DOWNLAYER(l);
                  }
--- io_os.c.orig        Tue Jan  1 21:54:41 2002
+++ io_os.c     Tue Jan  1 21:55:34 2002
@@ -122,7 +122,7 @@
          /* Need to make this portable, I haven't checked this
           * on non-UNIX.
           */
-#if 1
+#if 0
          /* Get descriptor flags */
          if((flags = fcntl(fd, F_GETFL, 0)) >= 0) {
                  /*int accmode = flags & O_ACCMODE;*/
@@ -187,7 +187,7 @@
  size_t PIO_os_write(theINTERP, ParrotIOLayer * layer, ParrotIO * io,
                        const void * buffer, size_t len) {
          int err;
-        int bytes;
+        size_t bytes;
          size_t to_write;
          const char * ptr;
  #if 0
@@ -215,6 +215,7 @@
  #ifdef EAGAIN
                                  case EAGAIN:    return bytes;
  #endif
+                                default:        return 0;
                          }
                  }
          }

Reply via email to