Project

General

Profile

Bug #7097 » thread_locals.patch

tenderlovemaking (Aaron Patterson), 10/03/2012 03:47 AM

View differences:

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;
(1-1/3)