ruby-changes:19921
From: nagachika <ko1@a...>
Date: Thu, 9 Jun 2011 23:47:39 +0900 (JST)
Subject: [ruby-changes:19921] nagachika:r31968 (trunk): * gc.c (rb_objspace_call_finalizer): use rb_typeddata_is_kind_of() for
nagachika 2011-06-09 23:45:56 +0900 (Thu, 09 Jun 2011) New Revision: 31968 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31968 Log: * gc.c (rb_objspace_call_finalizer): use rb_typeddata_is_kind_of() for type check to get rid of a double free when main Thread has singleton class. [ruby-core:36741] [Bug #4828] * thread.c (rb_obj_is_mutex): add a new utility function. * vm.c (rb_obj_is_thread): ditto. Modified files: trunk/ChangeLog trunk/gc.c trunk/internal.h trunk/thread.c trunk/vm.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31967) +++ ChangeLog (revision 31968) @@ -1,3 +1,11 @@ +Thu Jun 9 23:34:01 2011 CHIKANAGA Tomoyuki <nagachika00@g...> + + * gc.c (rb_objspace_call_finalizer): use rb_typeddata_is_kind_of() for + type check to get rid of a double free when main Thread has singleton + class. [ruby-core:36741] [Bug #4828] + * thread.c (rb_obj_is_mutex): add a new utility function. + * vm.c (rb_obj_is_thread): ditto. + Thu Jun 9 22:53:49 2011 CHIKANAGA Tomoyuki <nagachika00@g...> * test/ruby/test_thread.rb (TestThread#test_kill_thread_subclass): Index: thread.c =================================================================== --- thread.c (revision 31967) +++ thread.c (revision 31968) @@ -3350,6 +3350,17 @@ {mutex_mark, mutex_free, mutex_memsize,}, }; +VALUE +rb_obj_is_mutex(VALUE obj) +{ + if (rb_typeddata_is_kind_of(obj, &mutex_data_type)) { + return Qtrue; + } + else { + return Qfalse; + } +} + static VALUE mutex_alloc(VALUE klass) { Index: gc.c =================================================================== --- gc.c (revision 31967) +++ gc.c (revision 31968) @@ -3005,7 +3005,7 @@ while (p < pend) { if (BUILTIN_TYPE(p) == T_DATA && DATA_PTR(p) && RANY(p)->as.data.dfree && - RANY(p)->as.basic.klass != rb_cThread && RANY(p)->as.basic.klass != rb_cMutex) { + !rb_obj_is_thread((VALUE)p) && !rb_obj_is_mutex((VALUE)p) ) { p->as.free.flags = 0; if (RTYPEDDATA_P(p)) { RDATA(p)->dfree = RANY(p)->as.typeddata.type->function.dfree; Index: internal.h =================================================================== --- internal.h (revision 31967) +++ internal.h (revision 31968) @@ -27,6 +27,9 @@ VALUE rb_big_uminus(VALUE x); +VALUE rb_obj_is_thread(VALUE obj); +VALUE rb_obj_is_mutex(VALUE obj); + #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ Index: vm.c =================================================================== --- vm.c (revision 31967) +++ vm.c (revision 31968) @@ -1780,6 +1780,17 @@ }, }; +VALUE +rb_obj_is_thread(VALUE obj) +{ + if (rb_typeddata_is_kind_of(obj, &thread_data_type)) { + return Qtrue; + } + else { + return Qfalse; + } +} + static VALUE thread_alloc(VALUE klass) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/