Bug #970

Re: [ruby-cvs:28403] Ruby:r21185 (trunk): * thread.c (rb_thread_blocking_region): add a comment.

Added by Usaku NAKAMURA over 6 years ago. Updated about 4 years ago.

[ruby-dev:37677]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
ruby -v: Backport:

Description

=begin
あけましておめでとうございます、なかむら(う)です。

In message " 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, &region->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, &region->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

History

#1 Updated by Usaku NAKAMURA over 6 years ago

  • Category set to core
  • Assignee set to Koichi Sasada
  • Priority changed from Low to Normal
  • Target version set to 2.0.0

=begin

=end

#2 Updated by Koichi Sasada over 6 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)

 というわけで,元々の問題()は解決できたかと思います.

# どうでしょうか>うささん

 それはそれとして,rb_thread_call_with_gvl() のような関数は必要ではない
か,と思いますので,とりあえず experimental とコメントして追加しておきま
した.

 これらの修正(r21438,r21441)は1.9.1 にも,コミットしていただけるとよ
いかと思うのですが,いかがでしょうか>yuguiさん

--
// SASADA Koichi at atdot dot net

=end

#3 Updated by Yuki Sonoda over 6 years ago

=begin
On 1/12/09 1:19 PM, SASADA Koichi wrote:

 これらの修正(r21438,r21441)は1.9.1 にも,コミットしていただけるとよ
いかと思うのですが,いかがでしょうか>yuguiさん

うーん。設計変更ではありますけれども、がらみなら仕方ない
ですよね。マージしました。

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする

=end

#4 Updated by Usaku NAKAMURA over 6 years ago

=begin
こんにちは、なかむら(う)です。

In message " Re: [BUG:trunk] Re: Ruby:r21185 (trunk): * thread.c (rb_thread_blocking_region): add a comment."
on Jan.12,2009 13:19:50, ko1@atdot.net wrote:

 というわけで,元々の問題()は解決できたかと思います.

どうでしょうか>うささん

よさそうな気がするので、元々の問題(じゃなくて
)を修正するパッチをコミットしました。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#5 Updated by Yukihiro Matsumoto over 6 years ago

  • Status changed from Open to Closed

=begin

=end

Also available in: Atom PDF