Calling dispose on unix stdin no longer kills the VM
parent
d3ba7e1abe
commit
b2e45f199e
|
@ -1,7 +1,7 @@
|
|||
USING: io.files io.files.temp io.directories io.sockets io kernel threads
|
||||
namespaces tools.test continuations strings byte-arrays
|
||||
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
|
||||
|
||||
! Unix domain stream sockets
|
||||
|
@ -138,3 +138,13 @@ datagram-client delete-file
|
|||
input-stream get send
|
||||
] with-file-reader
|
||||
] 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
|
||||
|
|
20
vm/os-unix.c
20
vm/os-unix.c
|
@ -216,18 +216,21 @@ void safe_write(int fd, void *data, size_t size)
|
|||
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);
|
||||
if(bytes < 0)
|
||||
{
|
||||
if(errno == EINTR)
|
||||
safe_read(fd,data,size);
|
||||
return safe_read(fd,data,size);
|
||||
else
|
||||
{
|
||||
fatal_error("error reading fd",errno);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if(bytes != size)
|
||||
fatal_error("unexpected eof on fd",bytes);
|
||||
else
|
||||
return (bytes == size);
|
||||
}
|
||||
|
||||
void *stdin_loop(void *arg)
|
||||
|
@ -237,7 +240,9 @@ void *stdin_loop(void *arg)
|
|||
|
||||
while(loop_running)
|
||||
{
|
||||
safe_read(control_read,buf,1);
|
||||
if(!safe_read(control_read,buf,1))
|
||||
break;
|
||||
|
||||
if(buf[0] != 'X')
|
||||
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));
|
||||
|
||||
if(write(stdin_write,buf,bytes) != bytes)
|
||||
if(!check_write(stdin_write,buf,bytes))
|
||||
loop_running = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
safe_close(stdin_write);
|
||||
safe_close(control_write);
|
||||
safe_close(control_read);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue