https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2008-12-16T13:48:17Z
Ruby Issue Tracking System
Ruby master - Bug #886: GC from blocking region
https://redmine.ruby-lang.org/issues/886?journal_id=2089
2008-12-16T13:48:17Z
usa (Usaku NAKAMURA)
usa@garbagecollect.jp
<ul></ul><p>=begin<br>
こんにちは、なかむら(う)です。</p>
<p>In message "<a href="/issues/886">[ruby-dev:37448]</a> [Bug: trunk] GC from blocking region"<br>
on Dec.15,2008 22:44:31, <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> wrote:</p>
<blockquote>
<p>(c) blocking_region の中で,さらに ruby な環境にさわれる状態になり(GVL<br>
を取得する),メモリ確保を行う,ということが考えられます.性能はもちろん<br>
落ちますが(使いどころを間違えると,とてもとても遅くなります),どーして<br>
も必要な場合は使う,ってことが出来るかと思います.</p>
</blockquote>
<p>現状これができるAPIがないわけですが、追加できるものならすると<br>
しても、いつ頃これが可能になりそうですか?</p>
<a name="それでは"></a>
<h2 >それでは。<a href="#それでは" class="wiki-anchor">¶</a></h2>
<p>U.Nakamura <a href="mailto:usa@garbagecollect.jp" class="email">usa@garbagecollect.jp</a></p>
<p>=end</p>
Ruby master - Bug #886: GC from blocking region
https://redmine.ruby-lang.org/issues/886?journal_id=2219
2008-12-22T09:45:50Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p>U.Nakamura wrote::</p>
<blockquote>
<p>In message "<a href="/issues/886">[ruby-dev:37448]</a> [Bug: trunk] GC from blocking region"<br>
on Dec.15,2008 22:44:31, <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> wrote:</p>
<blockquote>
<p>(c) blocking_region の中で,さらに ruby な環境にさわれる状態になり(GVL<br>
を取得する),メモリ確保を行う,ということが考えられます.性能はもちろん<br>
落ちますが(使いどころを間違えると,とてもとても遅くなります),どーして<br>
も必要な場合は使う,ってことが出来るかと思います.</p>
</blockquote>
<p>現状これができるAPIがないわけですが、追加できるものならすると<br>
しても、いつ頃これが可能になりそうですか?</p>
</blockquote>
<p> 作ってみました.これで動くかやってもらえませんか.あと,名前のセンスが<br>
悪すぎるとか,そういう話もあるかと思うので,いい名前募集中です.</p>
<p>注意:</p>
<ul>
<li>rb_thread_call_with_gvl() に渡す関数の返値は VALUE だと<br>
mark されないことがあるので,VALUE の受け渡しは基本的にしない</li>
</ul>
<p> ちなみに,<a href="/issues/886">[ruby-dev:37448]</a> で示した解決策は穴があって,xmalloc したメ<br>
モリは xfree しなければならないという制約があります.なので,以下のよう<br>
にするのがよいのではないかと思います.</p>
<p>(a) malloc 試行 -> 失敗<br>
(b) rb_thread_call_with_gvl() を使って GC を強制発生<br>
(c) malloc 試行 -> 失敗<br>
(d) C レベルでの資源を回収(後始末)<br>
(e) rb_thread_call_with_gvl() で呼び出した関数中で NoMemoryError 発生</p>
<a name="Index-vm_coreh"></a>
<h1 >Index: vm_core.h<a href="#Index-vm_coreh" class="wiki-anchor">¶</a></h1>
<p>--- vm_core.h (リビジョン 20894)<br>
+++ vm_core.h (作業コピー)<br>
@@ -363,6 +363,7 @@ typedef struct rb_thread_struct<br>
int slice;</p>
<pre><code> native_thread_data_t native_thread_data;
</code></pre>
<ul>
<li>
<p>void *blocking_region_buffer;</p>
<p>VALUE thgroup;<br>
VALUE value;<br>
Index: thread.c<br>
===================================================================<br>
--- thread.c (リビジョン 20894)<br>
+++ thread.c (作業コピー)<br>
@@ -947,6 +947,7 @@ static inline void<br>
blocking_region_begin(rb_thread_t *th, struct rb_blocking_region_buffer<br>
*region,<br>
rb_unblock_function_t *func, void *arg)<br>
{</p>
</li>
<li>
<p>th->blocking_region_buffer = region;<br>
region->prev_status = th->status;<br>
set_unblock_function(th, func, arg, &region->oldubf);<br>
th->status = THREAD_STOPPED;<br>
@@ -1033,6 +1034,32 @@ rb_thread_blocking_region(<br>
}, ubf, data2);</p>
<p>return val;<br>
+}</p>
</li>
<li>
</ul>
<p>+/* alias of rb_thread_blocking_region() */<br>
+VALUE<br>
+rb_thread_call_without_gvl(</p>
<ul>
<li>rb_blocking_function_t *func, void *data1,</li>
<li>rb_unblock_function_t *ubf, void *data2)<br>
+{</li>
<li>return rb_thread_blocking_region(func, data1, ubf, data2);<br>
+}</li>
<li>
</ul>
<p>+void *<br>
+rb_thread_call_with_gvl(void *(*func)(void *), void *data1)<br>
+{</p>
<ul>
<li>rb_thread_t *th = ruby_thread_from_native();</li>
<li>struct rb_blocking_region_buffer *brb =</li>
<li>
<pre><code> (struct rb_blocking_region_buffer *)th->blocking_region_buffer;
</code></pre>
</li>
<li>struct rb_unblock_callback prev_unblock = th->unblock;</li>
<li>void *r;</li>
<li>
<li>blocking_region_end(th, brb);</li>
<li>/* enter to the Ruby world */</li>
<li>r = (*func)(data1);</li>
<li>/* levae from Ruby world */</li>
<li>blocking_region_begin(th, brb, prev_unblock.func, prev_unblock.arg);</li>
<li>return r;<br>
}</li>
</ul>
<p>/*</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Bug #886: GC from blocking region
https://redmine.ruby-lang.org/issues/886?journal_id=2241
2008-12-22T17:33:24Z
usa (Usaku NAKAMURA)
usa@garbagecollect.jp
<ul></ul><p>=begin<br>
こんにちは、なかむら(う)です。</p>
<p>In message "<a href="https://blade.ruby-lang.org/ruby-dev/37531">[ruby-dev:37531]</a> Re: [Bug: trunk] GC from blocking region"<br>
on Dec.22,2008 09:37:09, <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> wrote:</p>
<blockquote>
<p> 作ってみました.これで動くかやってもらえませんか.あと,名前のセンスが<br>
悪すぎるとか,そういう話もあるかと思うので,いい名前募集中です.</p>
</blockquote>
<p>rb_thread_from_native()がNULLを返して死にまくりでした。</p>
<a name="それでは"></a>
<h2 >それでは。<a href="#それでは" class="wiki-anchor">¶</a></h2>
<p>U.Nakamura <a href="mailto:usa@garbagecollect.jp" class="email">usa@garbagecollect.jp</a></p>
<p>=end</p>
Ruby master - Bug #886: GC from blocking region
https://redmine.ruby-lang.org/issues/886?journal_id=2299
2008-12-24T20:26:49Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p>U.Nakamura wrote::</p>
<blockquote>
<p>In message "<a href="https://blade.ruby-lang.org/ruby-dev/37531">[ruby-dev:37531]</a> Re: [Bug: trunk] GC from blocking region"<br>
on Dec.22,2008 09:37:09, <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> wrote:</p>
<blockquote>
<p> 作ってみました.これで動くかやってもらえませんか.あと,名前のセンスが<br>
悪すぎるとか,そういう話もあるかと思うので,いい名前募集中です.</p>
</blockquote>
<p>rb_thread_from_native()がNULLを返して死にまくりでした。</p>
</blockquote>
<p> なかださん,この辺ってどうなってましたっけ.</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Bug #886: GC from blocking region
https://redmine.ruby-lang.org/issues/886?journal_id=2591
2009-01-13T12:01:56Z
yugui (Yuki Sonoda)
yugui@yugui.jp
<ul><li><strong>Target version</strong> set to <i>1.9.1 RC2</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #886: GC from blocking region
https://redmine.ruby-lang.org/issues/886?journal_id=2637
2009-01-16T01:08:47Z
yugui (Yuki Sonoda)
yugui@yugui.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>=begin</p>
<p>=end</p>