Bug #970
closedRe: [ruby-cvs:28403] Ruby:r21185 (trunk): * thread.c (rb_thread_blocking_region): add a comment.
Description
=begin
あけましておめでとうございます、なかむら(う)です。
In message "[ruby-cvs:28403] Ruby:r21185 (trunk): * thread.c (rb_thread_blocking_region): add a comment."
on Dec.30,2008 16:57:54, ko1@ruby-lang.org wrote:
| ko1 2008-12-30 16:57:53 +0900 (Tue, 30 Dec 2008)
|
| New Revision: 21185
|
| http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21185
|
| Log:
| * thread.c (rb_thread_blocking_region): add a comment.
| * thread.c (rb_thread_call_without_gvl): added as a alias of
| rb_thread_blocking_region().
| * thread.c (rb_thread_call_with_gvl): added.
| * vm_core.h (rb_thread_t#blocking_region_buffer): added for
| rb_thread_call_with_gvl().
めでたくrb_thread_call_with_gvl()が入りましたが、rb_thread_t
に追加されたメンバblocking_region_bufferに値を設定していると
ころが存在しないような気がします。
あと、こっちはbugじゃなくてリクエストですが、C関数から自スレ
ッドがGVLを取得しているかどうかを判断するのが困難、というか、
rb_thread_call_with_gvl()内でやってるのと同じことをやる必要が
あって二度手間になるので、rb_thread_call_with_gvl()内でGVL取
得の有無を確認してよきに計らってくれた方がいいように思います。
以前ささださんにはIRCで「いらない」と言ってしまった気もしま¶
すが、やっぱり必要でした。¶
いちおう、以上2点のパッチをつけておきます。
Index: thread.c
--- thread.c (リビジョン 21276)
+++ thread.c (作業コピー)
@@ -954,6 +954,7 @@
{
region->prev_status = th->status;
set_unblock_function(th, func, arg, ®ion->oldubf);
-
th->blocking_region_buffer = region;
th->status = THREAD_STOPPED;
thread_debug("enter blocking region (%p)\n", (void *)th);
rb_gc_save_machine_context(th);
@@ -967,6 +968,7 @@
rb_thread_set_current(th);
thread_debug("leave blocking region (%p)\n", (void *)th);
remove_signal_thread_list(th); -
th->blocking_region_buffer = NULL;
reset_unblock_function(th, ®ion->oldubf);
if (th->status == THREAD_STOPPED) {
th->status = region->prev_status;
@@ -1101,13 +1103,15 @@
}brb = (struct rb_blocking_region_buffer *)th->blocking_region_buffer;
- prev_unblock = th->unblock;
- blocking_region_end(th, brb);
- if (brb) {
- prev_unblock = th->unblock;
- blocking_region_end(th, brb);
- }
/* enter to Ruby world: You can access Ruby values, methods and so on. */
r = (*func)(data1);
- /* levae from Ruby world: You can not access Ruby values, etc. */
- blocking_region_begin(th, brb, prev_unblock.func, prev_unblock.arg);
- /* leave from Ruby world: You can not access Ruby values, etc. */
- if (brb)
- blocking_region_begin(th, brb, prev_unblock.func, prev_unblock.arg);
return r;
}
それでは。
U.Nakamura usa@garbagecollect.jp
=end
Updated by usa (Usaku NAKAMURA) almost 16 years ago
- Category set to core
- Assignee set to ko1 (Koichi Sasada)
- Priority changed from 3 to Normal
- Target version set to 2.0.0
=begin
=end
Updated by ko1 (Koichi Sasada) almost 16 years ago
=begin
ささだです.
U.Nakamura wrote::
めでたくrb_thread_call_with_gvl()が入りましたが、rb_thread_t
に追加されたメンバblocking_region_bufferに値を設定していると
ころが存在しないような気がします。あと、こっちはbugじゃなくてリクエストですが、C関数から自スレ
ッドがGVLを取得しているかどうかを判断するのが困難、というか、
rb_thread_call_with_gvl()内でやってるのと同じことをやる必要が
あって二度手間になるので、rb_thread_call_with_gvl()内でGVL取
得の有無を確認してよきに計らってくれた方がいいように思います。以前ささださんにはIRCで「いらない」と言ってしまった気もしま¶
すが、やっぱり必要でした。¶
この問題は,年の初めに色々 IRC なりオフラインなりで議論しましたが,
xmalloc, xrealloc, xfree は GVL なくても呼べるべきだろう,ということにな
りました.
xmalloc, xrealloc, xfree は,ruby とは関係ないプログラムからも,「返値
を気にしなくてもよいメモリ管理関数」であるべきで,ruby とは関係なくても
動くべきだろう,という議論によります.
というわけで,以下のように振る舞うようにしました.
(1) GVL 獲得中は従来通り
(2) GVL ないときに,GC もしくは NoMemoryError 発生
(2.1) ruby スレッドだったら,GVL を獲得してそれらを
(2.2) ruby スレッドでなければ stderr に exit(1)
というわけで,元々の問題([ruby-dev:37383])は解決できたかと思います.
どうでしょうか>うささん¶
それはそれとして,rb_thread_call_with_gvl() のような関数は必要ではない
か,と思いますので,とりあえず experimental とコメントして追加しておきま
した.
これらの修正(r21438,r21441)は1.9.1 にも,コミットしていただけるとよ
いかと思うのですが,いかがでしょうか>yuguiさん
--
// SASADA Koichi at atdot dot net
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
=begin
On 1/12/09 1:19 PM, SASADA Koichi wrote:
これらの修正(r21438,r21441)は1.9.1 にも,コミットしていただけるとよ
いかと思うのですが,いかがでしょうか>yuguiさん
うーん。設計変更ではありますけれども、[ruby-dev:37383]がらみなら仕方ない
ですよね。マージしました。
--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする
=end
Updated by usa (Usaku NAKAMURA) almost 16 years ago
=begin
こんにちは、なかむら(う)です。
In message "[ruby-dev:37761] Re: [BUG:trunk] Re: [ruby-cvs:28403] Ruby:r21185 (trunk): * thread.c (rb_thread_blocking_region): add a comment."
on Jan.12,2009 13:19:50, ko1@atdot.net wrote:
というわけで,元々の問題([ruby-dev:37383])は解決できたかと思います.
どうでしょうか>うささん¶
よさそうな気がするので、元々の問題([ruby-dev:37383]じゃなくて
[ruby-core:19946])を修正するパッチをコミットしました。
それでは。¶
U.Nakamura usa@garbagecollect.jp
=end
Updated by matz (Yukihiro Matsumoto) almost 16 years ago
- Status changed from Open to Closed
=begin
=end