[#30549] [ANN] Ruby 1.8.6 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 をリリースしました。

14 messages 2007/03/12

[#30553] help: lib/shell for ruby 1.9 — keiju@... (Keiju ISHITSUKA)

けいじゅ@いしつかです.

13 messages 2007/03/13
[#30585] Re: help: lib/shell for ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/03/15

まつもと ゆきひろです

[#30587] Re: help: lib/shell for ruby 1.9 — keiju@... (石塚圭樹) 2007/03/15

けいじゅ@いしつかです.

[#30588] Re: help: lib/shell for ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/03/15

まつもと ゆきひろです

[ruby-dev:30636] Re: stdout flush in fork

From: "Nobuyoshi Nakada" <nobu@...>
Date: 2007-03-19 06:26:29 UTC
List: ruby-dev #30636
なかだです。

At Mon, 19 Mar 2007 13:28:46 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:30630]:
> とはいえ、flushせねばならないのはforkを行ったスレッドが出力
> したもので、他のスレッドが出力したものについては他のスレッド
> からいずれflushされるのは間違いないように思います。

通常の流れではそうですが、fork(2)がEAGAINで失敗したときにはリトライ前に
sleepしてますから、そこで他のスレッドからfork前に出力されてしまう可能性
はあるかもしれません。

1.8だとリトライしていたのはsystemだけだったんですが、rubyレベルで毎回そ
こまで面倒見ないといけないというのもイヤなのでProcess.forkもあわせてしま
いました。見落としてました。


Index: process.c
===================================================================
--- process.c	(revision 12090)
+++ process.c	(working copy)
@@ -1344,8 +1344,14 @@ rb_fork(int *status, int (*chfunc)(void*

 #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) {
@@ -1357,5 +1363,5 @@ rb_fork(int *status, int (*chfunc)(void*
     }
 #endif
-    while ((pid = fork()) < 0) {
+    for (; (pid = fork()) < 0; prefork()) {
 	switch (errno) {
 	  case EAGAIN:


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread