[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]