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

ruby-changes:35385

From: ko1 <ko1@a...>
Date: Tue, 9 Sep 2014 14:12:25 +0900 (JST)
Subject: [ruby-changes:35385] ko1:r47467 (trunk): * gc.c: move rb_objspace_t::flags::gc_stressfull after during_gc

ko1	2014-09-09 14:12:15 +0900 (Tue, 09 Sep 2014)

  New Revision: 47467

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47467

  Log:
    * gc.c: move rb_objspace_t::flags::gc_stressfull after during_gc
      to make accesssing both parameters easy.
    * gc.c (heap_get_freeobj): add LIKELY() hint.
    * gc.c (heap_get_freeobj_from_next_freepage): ditto.
    * gc.c (newobj_of): check both parameters at once for exceptional
      case.

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 47466)
+++ ChangeLog	(revision 47467)
@@ -1,3 +1,15 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Sep  9 14:09:36 2014  Koichi Sasada  <ko1@a...>
+
+	* gc.c: move rb_objspace_t::flags::gc_stressfull after during_gc
+	  to make accesssing both parameters easy.
+
+	* gc.c (heap_get_freeobj): add LIKELY() hint.
+
+	* gc.c (heap_get_freeobj_from_next_freepage): ditto.
+
+	* gc.c (newobj_of): check both parameters at once for exceptional
+	  case.
+
 Tue Sep  9 13:51:32 2014  Koichi Sasada  <ko1@a...>
 
 	* gc.c: add rb_objspace_t::flags::gc_stressfull and
Index: gc.c
===================================================================
--- gc.c	(revision 47466)
+++ gc.c	(revision 47467)
@@ -464,11 +464,11 @@ typedef struct rb_objspace { https://github.com/ruby/ruby/blob/trunk/gc.c#L464
 
     struct {
 	enum gc_stat stat : 2;
-	unsigned int  gc_stressfull: 1;
 	unsigned int immediate_sweep : 1;
 	unsigned int dont_gc : 1;
 	unsigned int dont_incremental : 1;
 	unsigned int during_gc : 1;
+	unsigned int gc_stressfull: 1;
 #if USE_RGENGC
 	unsigned int during_minor_gc : 1;
 #endif
@@ -1538,7 +1538,7 @@ heap_get_freeobj_from_next_freepage(rb_o https://github.com/ruby/ruby/blob/trunk/gc.c#L1538
     struct heap_page *page;
     RVALUE *p;
 
-    while (heap->free_pages == NULL) {
+    while (UNLIKELY(heap->free_pages == NULL)) {
 	heap_prepare(objspace, heap);
     }
     page = heap->free_pages;
@@ -1558,7 +1558,7 @@ heap_get_freeobj(rb_objspace_t *objspace https://github.com/ruby/ruby/blob/trunk/gc.c#L1558
     RVALUE *p = heap->freelist;
 
     while (1) {
-	if (p) {
+	if (LIKELY(p != NULL)) {
 	    heap->freelist = p->as.free.next;
 	    return (VALUE)p;
 	}
@@ -1594,15 +1594,17 @@ newobj_of(VALUE klass, VALUE flags, VALU https://github.com/ruby/ruby/blob/trunk/gc.c#L1594
     rb_objspace_t *objspace = &rb_objspace;
     VALUE obj;
 
-    if (UNLIKELY(during_gc)) {
-	dont_gc = 1;
-	during_gc = 0;
-	rb_bug("object allocation during garbage collection phase");
-    }
+    if (UNLIKELY(during_gc || ruby_gc_stressfull)) {
+	if (during_gc) {
+	    dont_gc = 1;
+	    during_gc = 0;
+	    rb_bug("object allocation during garbage collection phase");
+	}
 
-    if (UNLIKELY(ruby_gc_stressfull)) {
-	if (!garbage_collect(objspace, FALSE, FALSE, FALSE, GPR_FLAG_NEWOBJ)) {
-	    rb_memerror();
+	if (ruby_gc_stressfull) {
+	    if (!garbage_collect(objspace, FALSE, FALSE, FALSE, GPR_FLAG_NEWOBJ)) {
+		rb_memerror();
+	    }
 	}
     }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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