[#43465] GVL改善案 — KOSAKI Motohiro <kosaki.motohiro@...>
小崎です
[#43467] [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...>
kosakiです
ささだです.
> ささだです.
ささだです.
> ささだです.
自己解決しました
ささだです.
>> ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
>>> ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
[#43468] Re: [ruby-changes:19438] Ruby:r31478 (trunk): * test/date/*.rb: use skip /w messages. — KOSAKI Motohiro <kosaki.motohiro@...>
2011/5/8 tadf <ko1@atdot.net>:
> 表示したい場合を除いてはskipよりもreturnを使うようお願いしています。
>> 表示したい場合を除いてはskipよりもreturnを使うようお願いしています。
[#43476] [Ruby 1.9 - Feature #4653][Open] [PATCH 1/1] new method Enumerable#rude_map — Shyouhei Urabe <shyouhei@...>
遠藤です。
(05/08/2011 11:21 PM), Yusuke ENDOH wrote:
遠藤です。
卜部です。
At Mon, 9 May 2011 16:35:31 +0900,
遠藤です。
[#43493] [Ruby 1.9 - Feature #4657][Open] add option to hide skip messages on unit/test — Shota Fukumori <sorah@...>
> -q, --hide-skipでskipメッセージが表示されなくなります。
(05/09/2011 06:31 PM), Shota Fukumori wrote:
> (05/09/2011 06:31 PM), Shota Fukumori wrote:
2011/5/9 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
> 2011/5/9 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
[#43502] draft schedule of Ruby 1.9.3 — "Yuki Sonoda (Yugui)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
Hello,
(ruby-coreはずしました)
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
[#43549] RubyKaigi2011に'CRuby'コミッタの皆さまを招待いたします(締切:2011-06-15) — Kakutani Shintaro <shintaro.kakutani@...>
'CRuby'コミッタの皆さまへ
[#43554] [Ruby 1.9 - Bug #4696][Assigned] thread.c#lock_func() が spurious wakeup unsafe — Motohiro KOSAKI <kosaki.motohiro@...>
[#43606] [Ruby 1.9 - Bug #4808][Open] thread_wait_for() eats 100% of CPU power — Hidetoshi Nagai <nagai@...>
> いつからかは把握できていませんが (少なくとも 1.9.2p0 では発生しません),
[ruby-dev:43467] [Q] thread->interrupt_flag が適切に排他制御されていないように見える
kosakiです
Ruby VM internal
に詳しい方々に質問です。現在、thread->interrupt_flagはどうやって排他制御されるデザインになっていますでしょうか?
といいますのは
1.ビットマスクとして使っているので排他制御しないとフラグがロストしてえらい事になりそう
#define RUBY_VM_SET_INTERRUPT(th) ((th)->interrupt_flag |= 0x02)
#define RUBY_VM_SET_TIMER_INTERRUPT(th) ((th)->interrupt_flag |= 0x01)
#define RUBY_VM_SET_FINALIZER_INTERRUPT(th) ((th)->interrupt_flag |= 0x04)
#define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & 0x02)
2.割り込み処理でフラグをリセットする箇所ではGVLしかとってない
static void
rb_threadptr_execute_interrupts_rec(rb_thread_t *th, int sched_depth)
{
(snip)
while (th->interrupt_flag) {
enum rb_thread_status status = th->status;
int timer_interrupt = th->interrupt_flag & 0x01;
int finalizer_interrupt = th->interrupt_flag & 0x04;
th->interrupt_flag = 0;
3.タイマースレッドはTIMER_INTERRUPT bitを立てる時に、timer_thread_lock しか取ってない
static void
timer_thread_function(void *arg)
{
rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */
/* for time slice */
RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
4.thread.c では RUBY_VM_SET_INTERRUPT呼ぶときに thread->interrupt_lock 取るが
cont.c では取らない
5.gc.cも RUBY_VM_SET_FINALIZER_INTERRUPT 呼ぶときに特にロックを取らない
という、なかなか整合性がとれていなさそうな状況になっていそうだからです。なにか見落としていますでしょうか?
# 一瞬、すべて interrupt_lockで守るのがいいのかな。と思ったのですがよく考えたら native_mutex_lock()関数が
# thread.c 以外からは呼べないのでした。