[#29987] ライセンス論点整理 — Tacos <ozaki@...>

38 messages 2001/06/01

[#30030] Ruby license discussion — Masayuki Hatta <mhatta@...>

八田と申します。

23 messages 2001/06/02
[#30034] Re: Ruby license discussion — "Akinori MUSHA" <knu@...> 2001/06/02

At Sat, 2 Jun 2001 14:31:02 +0900,

[#30039] Re: Ruby license discussion — akira yamada / やまだあきら <akira@...> 2001/06/02

[#30056] Re: Ruby license discussion — Takaaki Higuchi <thiguchi@...> 2001/06/03

In "akira yamada / やまだあきら <akira@ruby-lang.org>" wrote:

[#30155] How do we treat local static variables? — IKEGAMI Daisuke <daisu-ik@...>

ruby-list の皆さんこんにちは。

13 messages 2001/06/09
[#30156] Re: How do we treat local static variables? — NISHI Takao <zophos@...9.com> 2001/06/09

にし@おかやまです。

[#30163] FW: [arg1:119] RE: [RubyUnit:4203] Re: インストーラ・プロジェクト — "KANEMITSU Masao" <masao-k@...>

金光です。RAAを改善しませんか?

10 messages 2001/06/10

[#30190] 呼び出し元のクラスを知る方法? — "Shin'ya Adzumi" <adzumi@...>

あづみです。

13 messages 2001/06/11

[#30215] パス文字列を操作するライブラリはありませんか? — "Kaoru Shirai" <shirai@...1jp.com>

 こんにちわ。常日頃 Ruby を愛用させて頂いております。

13 messages 2001/06/13

[#30270] setup.rb — rubikitch@...

るびきちです。

16 messages 2001/06/16
[#30291] Re: setup.rb — Minero Aoki <aamine@...> 2001/06/18

あおきです。すみません、見逃してました。

[#30292] Re: setup.rb — rubikitch <rubikitch@...> 2001/06/19

From: Minero Aoki <aamine@mx.edit.ne.jp>

[#30293] Re: setup.rb — TADA Tadashi <sho@...> 2001/06/19

ただただしです。

[#30305] TMarshal — rubikitch@...

るびきちです。

25 messages 2001/06/19

[#30333] 共同著作物の謎( re :ライセンス) — Tacos <ozaki@...>

13 messages 2001/06/20
[#30334] Re: 共同著作物の謎( re :ライセンス) — Tacos <ozaki@...> 2001/06/20

[ruby-list:30424] Re: 1.6.4 と open3

From: nobu.nakada@...
Date: 2001-06-30 16:35:18 UTC
List: ruby-list #30424
なかだです。

At Fri, 29 Jun 2001 23:42:37 +0900,
matz@ruby-lang.org (Yukihiro Matsumoto) wrote:
> 結局pidを取り出せればよいので、open3の返すIOのpidメソッドを
> 置き換えて、プロセスのpidを返すようにしてやれば良いかなと。
> でも、そうするとwaitを強要することになりますねえ。
> 
> 結局、取り出せないままの方が良いのかなって気になってきました。

(1) status を得るためには自動的に wait されてはいけない
(2) ゾンビを残さないためには必ず wait しなければならない

という条件があるわけですが、pid を取り出せるだけだと前者しか満
たしません。finalizer を使っても、今までのように終了したら即座
に取り除かれるのではなくて、無期限にゾンビが残ることはない、と
いうところで妥協が必要ですが。

  [ruby-list:30417]はやっぱりダメダメでした。最初の close で
wait してしまうと、場合によって(stdin を読まないプログラムの
stdin を close したときとか)デッドロックしてしまいます。やっぱ
り自動的に wait するなら全部 close したあとでないとまずいようで
す。つまり基本形としては[ruby-list:30388]ということになります。
ただ最後の close で暗黙のうちに wait っていうのはすごく分かりづ
らい気がして来ましたので、

>   * pipeに特異メソッドを付加

これと finalizer を使ったパターンのパッチです。今のところこれが
一番マシに思えます。でなければ、

>   * 現状のまま(ステータスは無視)

と、ステータスを得られるが wait が必要なものと二つに分けるか。

# ところで 1.6 の open3.rb は動かなくなってますが。


Index: lib/open3.rb
===================================================================
RCS file: /cvs/ruby/src/ruby/lib/open3.rb,v
retrieving revision 1.7
diff -u -2 -p -w -r1.7 open3.rb
--- lib/open3.rb	2001/05/16 09:05:54	1.7
+++ lib/open3.rb	2001/06/30 16:15:53
@@ -17,6 +17,4 @@ module Open3
     pid = fork{
       # child
-      fork{
-	# grandchild
 	pw[1].close
 	STDIN.reopen(pw[0])
@@ -33,12 +31,11 @@ module Open3
 	exec(*cmd)
       }
-      exit!
-    }
 
     pw[0].close
     pr[1].close
     pe[1].close
-    Process.waitpid(pid)
+    get_pid = proc {pid}
     pi = [pw[1], pr[0], pe[0]]
+    pi.each {|p| class << p; self; end.module_eval {define_method(:pid, get_pid)}}
     if defined? yield
       begin
@@ -46,9 +43,32 @@ module Open3
       ensure
 	pi.each{|p| p.close unless p.closed?}
+	begin Process.waitpid(pid); rescue Errno::ECHILD; end
       end
     end
+    Sweeper.new(pi, pid)
     pi
   end
   module_function :popen3
+
+  class Sweeper < Hash
+    def initialize(deps, arg)
+      super()
+      finalizer = method(:finalize).to_proc
+      ObjectSpace.define_finalizer(self, finalizer)
+      deps.each do |obj| 
+	self[obj.__id__] = arg
+	ObjectSpace.define_finalizer(obj, finalizer)
+      end
+    end
+
+    private
+
+    def finalize(id)
+      id = delete(id) {return}
+      empty? or return
+      ObjectSpace.undefine_finalizer(self)
+      Process.waitpid(id)
+    end
+  end
 end
 


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

In This Thread