ささだです.

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