xcorp::When it rains, it pours.

"The nice thing about rain," said Eeyore, "is that it always stops. Eventually."

reentrant な method で serialize

再入可能 (reentrant) な method があって、どうしてもあるリソースに対する処理の部分を serialize したいのだが、ruby でどう書けばいいのか分からんのね。あるリソースというのはぶっちゃけファイルなんだけど、File::flock() では同一プロセス・同一スレッド内での serialize つーか排他制御には使えない。まあプロセス単位でのロックだから当たり前ですやね。で、Mutex とかどうだろ?と思ったが同一スレッド内だからこれもダメ。本来なら、ファイルじゃなくて別のリソースを使ったり、より上位で serialize するのが正当なんだが、どうしてもやんごとなき諸事情でその method 内で排他制御してやらないとイカンのだ。さらに制約があって、ruby パッケージに含まれている組込ライブラリと添付ライブラリ以外は使えないときたもんだ。じゃ、どうしろと?

そこで、お目にかけるのも非常にこっぱずかしいシロモノができました(;´Д`)あーあ

class Hoge
  @@lockFlag = false

  def fuga
    begin
        :
        :
      sleep(0.1) while(@@lockFlag)
      @@lockFlag = true
      # serialize 対象処理
      @@lockFlag = false
        :
        :
    ensure
      @@lockFlag = false
    end
  end