Bug #7097 » thread_locals.patch
test/ruby/test_thread.rb | ||
---|---|---|
end
|
||
end
|
||
def test_main_thread_local_in_enumerator
|
||
assert_equal Thread.main, Thread.current
|
||
Thread.current.set_local :foo, "bar"
|
||
thread, value = Fiber.new {
|
||
Fiber.yield [Thread.current, Thread.current.get_local(:foo)]
|
||
}.resume
|
||
assert_equal Thread.current, thread
|
||
assert_equal Thread.current.get_local(:foo), value
|
||
end
|
||
def test_thread_local_in_enumerator
|
||
Thread.new {
|
||
Thread.current.set_local :foo, "bar"
|
||
thread, value = Fiber.new {
|
||
Fiber.yield [Thread.current, Thread.current.get_local(:foo)]
|
||
}.resume
|
||
assert_equal Thread.current, thread
|
||
assert_equal Thread.current.get_local(:foo), value
|
||
}.join
|
||
end
|
||
def test_mutex_synchronize
|
||
m = Mutex.new
|
||
r = 0
|
thread.c | ||
---|---|---|
return rb_thread_local_aset(self, rb_to_id(id), val);
|
||
}
|
||
static VALUE
|
||
rb_thread_get_local(VALUE thread, VALUE id)
|
||
{
|
||
VALUE locals;
|
||
locals = rb_iv_get(thread, "locals");
|
||
return rb_hash_aref(locals, id);
|
||
}
|
||
static VALUE
|
||
rb_thread_set_local(VALUE thread, VALUE id, VALUE val)
|
||
{
|
||
VALUE locals;
|
||
locals = rb_iv_get(thread, "locals");
|
||
return rb_hash_aset(locals, id, val);
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* thr.key?(sym) -> true or false
|
||
... | ... | |
rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
|
||
rb_define_method(rb_cThread, "[]", rb_thread_aref, 1);
|
||
rb_define_method(rb_cThread, "[]=", rb_thread_aset, 2);
|
||
rb_define_method(rb_cThread, "get_local", rb_thread_get_local, 1);
|
||
rb_define_method(rb_cThread, "set_local", rb_thread_set_local, 2);
|
||
rb_define_method(rb_cThread, "key?", rb_thread_key_p, 1);
|
||
rb_define_method(rb_cThread, "keys", rb_thread_keys, 0);
|
||
rb_define_method(rb_cThread, "priority", rb_thread_priority, 0);
|
vm.c | ||
---|---|---|
GetThreadPtr(self, th);
|
||
th_init(th, self);
|
||
rb_iv_set(self, "locals", rb_hash_new());
|
||
th->vm = vm;
|
||
th->top_wrapper = 0;
|
||
... | ... | |
/* create main thread */
|
||
th_self = th->self = TypedData_Wrap_Struct(rb_cThread, &thread_data_type, th);
|
||
rb_iv_set(th_self, "locals", rb_hash_new());
|
||
vm->main_thread = th;
|
||
vm->running_thread = th;
|
||
th->vm = vm;
|