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
|
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
|
||||||
|
|
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);
|
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue