<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/xml.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>nulog, NULL::something : out of the headphone &gt; 2004 &gt; September &gt; 16 &gt; Ruby 時間制限付きでユーザコードを実行する。</title>
  <link href="http://lowreal.net/logs/2004/09/16/1"/>
  <icon>http://lowreal.net/img/banner.png</icon>
  <link rel="self" type="application/atom+xml" href="http://lowreal.net/logs/2004/09/16/1.atom"/>
  <link rel="alternate" type="application/xhtml+xml" href="http://lowreal.net/logs/2004/09/16/1.xhtml"/>
  <updated>2004-09-16T15:35:34+09:00</updated>
  <author>
    <name>cho45(砂糖)</name>
  </author>
  <id>http://lowreal.net/2004/09/16/1</id>
  <entry>
    <title>Ruby 時間制限付きでユーザコードを実行する。</title>
    <link rel="alternate" type="text/html" href="http://lowreal.net/logs/2004/09/16/1.html"/>
    <link rel="alternate" type="application/xml+xhtml" href="http://lowreal.net/logs/2004/09/16/1.xhtml"/>
    <updated>2004-09-16T15:35:34+09:00</updated>
    <published>2004-09-16T15:35:34+09:00</published>
    <id>http://lowreal.net/2004/09/16/1</id>
    <category term="prog"/>
    <content type="xhtml" xml:base="http://lowreal.net/">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p><abbr title="Internet Relay Chat">IRC</abbr> BOT に Ruby 式評価する機能でもと。</p>
        <del datetime="2004-09-16T17:23:17+09:00">
          <pre class="Ruby">
def safe(lvl, tm=1)
    result = nil
    Thread::start(lvl, tm) do |level, time|
        $SAFE = level
        Thread::exclusive do
            timeout(time) do
                tl = Thread::list
                result = yield
                (Thread::list - tl).each {|th| th.join}
            end
        end
    end.join
    result
end</pre>
          <p>果たしてこれでいいかは不明だけど、たぶんちゃんと動いてる。<code class="Ruby">Thread.start { loop { sleep 0.1 } }; Thread.start { loop {sleep 0.1} }</code> みたいなのを投げても大丈夫。でも何かデッドロッ（あｑｗせｄｒｆｔｇｙふじこｌｐ</p>
        </del>
        <ins datetime="2004-09-16T17:23:28+09:00">
          <p>だめだ。上のじゃだめ。やっぱデッドロックしてるっぽい（<code class="Ruby">Thread::critical = true</code> してみればエラーになる。 exclusive はエラー処理やってるから分からないだけだ）。他のスレッドに処理が移ってスレッド作られると困るから exclusive してるんだけど、なんか上手くいってない。とりあえず今のところ他のスレッドで新しいスレッド作ることはないから exclusive をコメントアウト。</p>
          <p>まぁ原因は (Thread::list - tl) なんだけど。何故か全部のスレッドが入ってる。</p>
        </ins>
        <ins datetime="2004-09-16T18:01:25+09:00">
          <p>よく分からないけど書き換え。critical 設定するとダメくさいのでもうアレやこれや。</p>
          <pre class="Ruby">
def safe(lvl, tm=1)
    result = nil
    tl = Thread::list
    t = Thread::start(lvl) do |level|
        $SAFE = level
        result = yield
    end.join(tm)
    (Thread::list - tl).each {|th| th.kill}
    raise TimeoutError unless t
    result
end</pre>
        </ins>
      </div>
    </content>
  </entry>
</feed>
