diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | process.c | 12 |
2 files changed, 14 insertions, 3 deletions
@@ -1,3 +1,8 @@ +Tue Mar 20 09:13:10 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * process.c (rb_fork): flush stdouts always before fork(2). + fixed: [ruby-dev:30612] + Tue Mar 20 01:38:48 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> * thread.c (thread_start_func_2): store the result of first_func @@ -1343,10 +1343,16 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg) #endif #ifndef __VMS - rb_io_flush(rb_stdout); - rb_io_flush(rb_stderr); +#define prefork() ( \ + rb_io_flush(rb_stdout), \ + rb_io_flush(rb_stderr) \ + ) +#else +#define prefork() ((void)0) #endif + prefork(); + #ifdef FD_CLOEXEC if (chfunc) { if (pipe(ep)) return -1; @@ -1356,7 +1362,7 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg) } } #endif - while ((pid = fork()) < 0) { + for (; (pid = fork()) < 0; prefork()) { switch (errno) { case EAGAIN: #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN |