[#24134] File.rename error message — Kazuhiro Yoshida <moriq.kazuhiro@...>

もりきゅうです。

14 messages 2000/08/08
[#24135] Re: File.rename error message — Takahiro Kambe <taca@...> 2000/08/08

In message <200008081252.AA00846@VZF07161.nifty.ne.jp>

[#24158] Hash の初期値に [] を使う — Mitsuhiro Kondo <kondo@...>

rubyを使っていて不思議に思ったことがあります。

16 messages 2000/08/11

[#24176] FreeBSD ports — "Akinori -Aki- MUSHA" <knu@...>

 こんにちは、 knu です。

31 messages 2000/08/11
[#24187] Re: FreeBSD ports — Yasuhiro Fukuma <yasuf@...> 2000/08/12

最近ports関連はすっかりさぼっている福間@福岡 です。

[#24190] Re: FreeBSD ports — "Akinori -Aki- MUSHA" <knu@...> 2000/08/13

 こんにちは。

[#24197] Re: FreeBSD ports — Takahiro Kambe <taca@...> 2000/08/14

In message <86vgx5fv7j.wl@daemon.local.idaemons.org>

[#24199] Re: FreeBSD ports — Yasuhiro Fukuma <yasuf@...> 2000/08/14

福間@福岡 です。

[#24191] drb.rb: 0x40155740 is recycled object (IndexError) — Hideto ISHIBASHI <hideto-i@...4u.or.jp>

おひさしぶりです。石橋秀仁です。

15 messages 2000/08/14
[#24192] Re: drb.rb: 0x40155740 is recycled object (IndexError) — Masatoshi SEKI <m_seki@...> 2000/08/14

[#24221] Re: drb.rb: 0x40155740 is recycled object(IndexError) — Hideto ISHIBASHI <hideto-i@...4u.or.jp> 2000/08/15

石橋秀仁です。咳さん、お返事ありがとうございます。

[#24223] Re: drb.rb: 0x40155740 is recycled object(IndexError) — Masatoshi SEKI <m_seki@...> 2000/08/15

[#24229] Re: drb.rb: 0x40155740 is recycledobject(IndexError) — Hideto ISHIBASHI <hideto-i@...4u.or.jp> 2000/08/16

石橋秀仁です。咳さん、お返事ありがとうございます。

[#24324] ruby の発展の為に — "Mitsuo Igarashi" <mitsu5@...>

Windows に ruby をインストールしようとして、皆様に助けられ

87 messages 2000/08/21
[#24328] Re: ruby の発展の為に — Takahiro Kambe <taca@...> 2000/08/21

思いっ切りUNIXな者からの、おそらく偏ってるであろう意見です。

[#24338] Re: ruby の発展の為に — kiri@... 2000/08/22

桐山です。

[#24342] Re: ruby の発展の為に — gotoken@... (GOTO Kentaro) 2000/08/22

ごとけんです

[#24344] Re: ruby の発展の為に — rubikitch <rubikitch@...> 2000/08/22

From: gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro)

[#24382] Re: ruby の発展の為に — Koji Arai <JCA02266@...> 2000/08/22

新井です。

[#24390] Re: ruby の発展の為に — rubikitch <rubikitch@...> 2000/08/23

From: Koji Arai <JCA02266@nifty.ne.jp>

[#24391] Ruby Documentation Project(仮) — rubikitch <rubikitch@...> 2000/08/23

From: rubikitch <rubikitch@ruby-lang.org>

[#24398] Re: Ruby Documentation Project(仮) — Koji Arai <JCA02266@...> 2000/08/23

新井です。

[#24401] — rubikitch <rubikitch@...> 2000/08/23

From: Koji Arai <JCA02266@nifty.ne.jp>

[#24404] Re: — Koji Arai <JCA02266@...> 2000/08/23

新井です。

[#24405] Re: — rubikitch <rubikitch@...> 2000/08/23

From: Koji Arai <JCA02266@nifty.ne.jp>

[#24406] Re: — Koji Arai <JCA02266@...> 2000/08/23

新井です。

[#24407] Re: Ruby Documentation Project(仮) — rubikitch <rubikitch@...> 2000/08/23

From: Koji Arai <JCA02266@nifty.ne.jp>

[#24413] Re: Ruby Documentation Project(仮) — MOROHOSHI Akihiko <moro@...> 2000/08/23

師星です。

[#24414] Re: Ruby Documentation Project(仮) — rubikitch <rubikitch@...> 2000/08/23

From: MOROHOSHI Akihiko <moro@remus.dti.ne.jp>

[#24419] Re: Ruby Documentation Project(仮) — MOROHOSHI Akihiko <moro@...> 2000/08/23

師星です。

[#24421] Re: Ruby Documentation Project(仮) — rubikitch <rubikitch@...> 2000/08/23

From: MOROHOSHI Akihiko <moro@remus.dti.ne.jp>

[#24433] Re: Ruby DocumentationProject(仮) — Koji Arai <JCA02266@...> 2000/08/23

新井です。

[#24451] Re: Ruby DocumentationProject(仮) — Tadayoshi Funaba <tadf@...> 2000/08/24

ふなばです (RD の話題についていけてない)。

[#24460] Re: RubyDocumentationProject(仮) — Koji Arai <JCA02266@...> 2000/08/24

新井です。

[#24481] Re: RubyDocumentationProject(仮) — Tadayoshi Funaba <tadf@...> 2000/08/25

ふなばです。

[#24518] Re: RubyDocumentationProject(仮) — Koji Arai <JCA02266@...> 2000/08/26

新井です。

[#24341] install guide draft — gotoken@... (GOTO Kentaro)

ごとけんです

106 messages 2000/08/22
[#24420] did commit install guide — gotoken@... (GOTO Kentaro) 2000/08/23

ごとけんです

[#24448] Re: did commit install guide — TAKAHASHI Masayoshi <maki@...> 2000/08/24

高橋征義です。

[#24469] レンタルサーバで eruby — Tokita Kousui <ktokita@...>

前にレンタルサーバでerubyを動かせないと騒いでた時田です(^^;

22 messages 2000/08/24
[#24476] Re: レンタルサーバで eruby — TAKEUCHi Kahori <takeuchi@...> 2000/08/24

たけうちかほりです。

[#24550] Array への nil の代入について — Kenya Ogata <k_ogata@...>

おがたといいます。

30 messages 2000/08/27
[#24558] Re: Array への nil の代入について — Kenya Ogata <k_ogata@...> 2000/08/27

おがたです

[#24564] Ruby の落とし穴 — Kazuhiro NISHIYAMA <zn@...> 2000/08/27

Kenya Ogata <k_ogata@mbd.nifty.com> wrote:

[#24648] RDP のフォーマット案 — Koji Arai <JCA02266@...>

新井です。

15 messages 2000/08/30

[ruby-list:24221] Re: drb.rb: 0x40155740 is recycled object(IndexError)

From: Hideto ISHIBASHI <hideto-i@...4u.or.jp>
Date: 2000-08-15 16:48:25 UTC
List: ruby-list #24221
石橋秀仁です。咳さん、お返事ありがとうございます。

> > 問題のスクリプトは何をしているかというと、
> > queueに入れたオブジェクトを、しばらくしてからpopしています。
> > そのものはいま出せないので、それに近いのを出します。
> 
> 添付のスクリプトだと recycled object のエラーは出ないですよね。
> 
> おそらく、queueに出し入れしているオブジェクトは、dumpできない
> ものではないですか ?

その通りです。popの返り値はoracle.rbのOracleオブジェクトです。
いわゆるウェブアプリサーバのDBコネクションプーラ機能です。
あらかじめ複数のコネクションを確保しておき、リクエストごとに
1つ使い、定期補充します。


同じエラーを再現するミニマムなスクリプト(svr.rb, clnt.rb)
を添付します。それぞれ別のターミナルで実行します。
 ターミナル1: ruby svr.rb
 ターミナル2: ruby clnt.rb
 ターミナル3: ruby clnt.rb
# すばやくやるのがポイントです (^^;
ターミナル3でのclnt.rb起動時に、"recycled object"エラーになります。

> このとき、参照されているオブジェクトがGCされてしまうと例の
> エラーが出る可能性があります。
> 
> 参照で送信されるオブジェクトをGCから守る方法は drb にはありませんので、
> なにか工夫してくださいません。すみません。

drbのオプションとしてそういう機能があるとうれしいです。
設定されたタイムアウト時間だけは参照を保持する機能(下記)。

> 咳は、時限付きセッションオブジェクトを作って参照しておくとか
> イテレータを使って保護したりしてます。

なるほど。イテレータ内スコープの変数に代入して、
イテレータ内だけの寿命を確保するわけですね。となると、

>   サーバ側
>   def query(s)
>     result = some_query(s)
>     yield(result)
>   end

  def query(s)
    yield(some_query(s))
  end
と書くと、意味がないのですよね。


> あと、DRbIdConv を差し替えると objectのIDに依らない参照を実装できます。
> IDの代わりに名前(文字列)で参照したり、new()のパラメータで参照したり
> するというのも手です。
> (実は[ruby-list:23715]のflyaway.rbはこれをやろうとしてた)

IDに依らない参照ではありませんが、DRbIdConvに差し替えによって、
上述の「時限付き参照表」を作れますね。書いたので添付します
(drb_ref_id_conv.rb)。"recycled object"エラーは出ません。

また、タイムアウトによって、オブジェクトがGCされて、
捨てられているのを確認しました。
  ObjectSpace.each_object(Foo) { count += 1 }
の部分です。画面に表示されるカウントでチェックできます。

これを使ってdrbを書き換えると、実際にリモートで参
照されている期間中だけGCされないようになります。
「タイムアウト」までの無駄な保持期間をなくせると思うので、
検討してみてください。>咳さん

> dRubyは応用編なページを書こうと思ってるのですが、
> 需要がなさそうで止まってます。

ぼくにお手伝いさせていただけることがあれば、ぜひ。

--
石橋秀仁 hideto@jobweb.co.jp ICQ: 83329246
http://www.rr.iij4u.or.jp/~hideto-i/index.html

Attachments (3)

svr.rb (427 Bytes, text/x-ruby)
require 'thread'
require 'drb/drb'

here = 'druby://localhost:17640'

class Queue
  include DRbUndumped
end

class Foo
  include DRbUndumped
  def foo
    self.id
  end
end

queue = Queue.new
DRb.start_service(here, queue)

Thread.start do
  while true
    queue.push(Foo.new)
    sleep 1
#    count = 0
#    ObjectSpace.each_object(Foo) { count += 1 }
#    print "count=", count, "\n"
    GC.start
  end
end

DRb.thread.join

clnt.rb (180 Bytes, text/x-ruby)
require 'drb/drb'

there = 'druby://localhost:17640'

DRb.start_service(nil)
queue = DRbObject.new(nil, there)

while true
  obj = queue.pop
  print obj.id, ':', obj.foo, "\n"
end
drb_ref_id_conv.rb (1.44 KB, text/x-ruby)
require 'drb/drb'

class DRbRefIdConv

  def initialize(time_to_live)
    @time_to_live = time_to_live
    @thr_table = {}     # {id => object}
    @obj_table = {}     # {id => killer thread}
    @thr_sync = Mutex.new
    @obj_sync = Mutex.new
  end

  def to_obj(id)
    obj = ObjectSpace._id2ref(id)
    set_killer(id)
    set_obj(id, obj)
    obj
  end

  def to_id(obj)
    id = obj.id
    set_killer(id)
    set_obj(id, obj)
    id
  end

 private
  # note: set_killer before set_obj
  def set_obj(id, obj)
    @obj_sync.synchronize do
      @obj_table[id] = obj
    end
  end

  def set_killer(id)     # reset killer
    @thr_sync.synchronize do
      thr = @thr_table[id]
      Thread.kill(thr) if thr
      @thr_table[id] = killer(id)
    end
  end

  def killer(id)
    Thread.start do
      sleep(@time_to_live)
      @obj_sync.synchronize do
        @obj_table[id] = nil
      end
    end
  end
end


if $0 == __FILE__
  require 'thread'

  class Queue
    include DRbUndumped
  end

  class Foo
    include DRbUndumped
    def initialize(n)
      @n = n
    end
    def foo
      @n
    end
  end

  here = ARGV.shift
  queue = Queue.new
  DRb.install_id_conv(DRbRefIdConv.new(5))
  DRb.start_service(here, queue)

  Thread.start do
    i = 0
    loop do
      queue.push(Foo.new(i))
      i = i + 1
      sleep 1
      count = 0
      ObjectSpace.each_object(Foo) { count += 1 }
      print "count=", count, "\n"
      GC.start
    end
  end
  DRb.thread.join

end

In This Thread