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; } } }