Calling dispose on unix stdin no longer kills the VM

db4
Slava Pestov 2008-12-20 18:02:08 -06:00
parent d3ba7e1abe
commit b2e45f199e
2 changed files with 23 additions and 9 deletions

View File

@ -1,7 +1,7 @@
USING: io.files io.files.temp io.directories io.sockets io kernel threads USING: io.files io.files.temp io.directories io.sockets io kernel threads
namespaces tools.test continuations strings byte-arrays namespaces tools.test continuations strings byte-arrays
sequences prettyprint system io.encodings.binary io.encodings.ascii sequences prettyprint system io.encodings.binary io.encodings.ascii
io.streams.duplex destructors make ; io.streams.duplex destructors make io.launcher ;
IN: io.backend.unix.tests IN: io.backend.unix.tests
! Unix domain stream sockets ! Unix domain stream sockets
@ -138,3 +138,13 @@ datagram-client delete-file
input-stream get send input-stream get send
] with-file-reader ] with-file-reader
] must-fail ] must-fail
! closing stdin caused some problems
[ ] [
[
vm ,
"-i=" image append ,
"-run=none" ,
"-e=USING: destructors namespaces io calendar threads ; input-stream get dispose 1 seconds sleep" ,
] { } make try-process
] unit-test

View File

@ -216,18 +216,21 @@ void safe_write(int fd, void *data, size_t size)
fatal_error("error writing fd",errno); fatal_error("error writing fd",errno);
} }
void safe_read(int fd, void *data, size_t size) bool safe_read(int fd, void *data, size_t size)
{ {
ssize_t bytes = read(fd,data,size); ssize_t bytes = read(fd,data,size);
if(bytes < 0) if(bytes < 0)
{ {
if(errno == EINTR) if(errno == EINTR)
safe_read(fd,data,size); return safe_read(fd,data,size);
else else
{
fatal_error("error reading fd",errno); fatal_error("error reading fd",errno);
return false;
}
} }
else if(bytes != size) else
fatal_error("unexpected eof on fd",bytes); return (bytes == size);
} }
void *stdin_loop(void *arg) void *stdin_loop(void *arg)
@ -237,7 +240,9 @@ void *stdin_loop(void *arg)
while(loop_running) while(loop_running)
{ {
safe_read(control_read,buf,1); if(!safe_read(control_read,buf,1))
break;
if(buf[0] != 'X') if(buf[0] != 'X')
fatal_error("stdin_loop: bad data on control fd",buf[0]); fatal_error("stdin_loop: bad data on control fd",buf[0]);
@ -258,16 +263,15 @@ void *stdin_loop(void *arg)
{ {
safe_write(size_write,&bytes,sizeof(bytes)); safe_write(size_write,&bytes,sizeof(bytes));
if(write(stdin_write,buf,bytes) != bytes) if(!check_write(stdin_write,buf,bytes))
loop_running = false; loop_running = false;
break; break;
} }
} }
} }
safe_close(stdin_write); safe_close(stdin_write);
safe_close(control_write); safe_close(control_read);
return NULL; return NULL;
} }