cvs: ZendEngine2(PHP_5_3) / zend_gc.c zend_gc.h

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1207935113@cvsserver>
dmitry		Fri Apr 11 17:31:53 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /ZendEngine2	zend_gc.c zend_gc.h 
  Log:
  Speedup GC initialization
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_gc.c?r1=1.1.2.10&r2=1.1.2.11&diff_format=u
Index: ZendEngine2/zend_gc.c
diff -u ZendEngine2/zend_gc.c:1.1.2.10 ZendEngine2/zend_gc.c:1.1.2.11
--- ZendEngine2/zend_gc.c:1.1.2.10	Wed Mar 19 11:46:10 2008
+++ ZendEngine2/zend_gc.c	Fri Apr 11 17:31:53 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_gc.c,v 1.1.2.10 2008/03/19 11:46:10 dmitry Exp $ */
+/* $Id: zend_gc.c,v 1.1.2.11 2008/04/11 17:31:53 dmitry Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -111,20 +111,18 @@
 	GC_G(zobj_marked_grey) = 0;
 #endif
 
-	if (GC_G(buf) &&
-	    (GC_G(roots).next != &GC_G(roots) ||
-	     GC_G(roots).prev != &GC_G(roots))) {
-
+	if (GC_G(buf)) {
 		GC_G(roots).next = &GC_G(roots);
 		GC_G(roots).prev = &GC_G(roots);
 
-		GC_G(unused) = &GC_G(buf)[0];
-		for (i = 0; i < GC_ROOT_BUFFER_MAX_ENTRIES-1; i++) {
-			GC_G(buf)[i].prev = &GC_G(buf)[i+1];
-		}
-		GC_G(buf)[GC_ROOT_BUFFER_MAX_ENTRIES-1].prev = NULL;
+		GC_G(unused) = NULL;
+		GC_G(first_unused) = GC_G(buf);
 
 		GC_G(zval_to_free) = NULL;
+	} else {
+		GC_G(unused) = NULL;
+		GC_G(first_unused) = NULL;
+		GC_G(last_unused) = NULL;
 	}
 }
 
@@ -132,6 +130,7 @@
 {
 	if (GC_G(buf) == NULL && GC_G(gc_enabled)) {
 		GC_G(buf) = (gc_root_buffer*) malloc(sizeof(gc_root_buffer) * GC_ROOT_BUFFER_MAX_ENTRIES);
+		GC_G(last_unused) = &GC_G(buf)[GC_ROOT_BUFFER_MAX_ENTRIES];
 		gc_reset(TSRMLS_C);
 	}
 }
@@ -164,7 +163,12 @@
 		if (!GC_ZVAL_ADDRESS(zv)) {
 			gc_root_buffer *newRoot = GC_G(unused);
 
-			if (!newRoot) {
+			if (newRoot) {
+				GC_G(unused) = newRoot->prev;
+			} else if (GC_G(first_unused) != GC_G(last_unused)) {
+				newRoot = GC_G(first_unused);
+				GC_G(first_unused)++;
+			} else {
 				if (!GC_G(gc_enabled)) {
 					GC_ZVAL_SET_BLACK(zv);
 					return;
@@ -177,10 +181,9 @@
 					return;
 				}
 				GC_ZVAL_SET_PURPLE(zv);
+				GC_G(unused) = newRoot->prev;
 			}
 
-			GC_G(unused) = newRoot->prev;
-
 			newRoot->next = GC_G(roots).next;
 			newRoot->prev = &GC_G(roots);
 			GC_G(roots).next->prev = newRoot;
@@ -215,7 +218,12 @@
 		if (!GC_ADDRESS(obj->buffered)) {
 			gc_root_buffer *newRoot = GC_G(unused);
 
-			if (!newRoot) {
+			if (newRoot) {
+				GC_G(unused) = newRoot->prev;
+			} else if (GC_G(first_unused) != GC_G(last_unused)) {
+				newRoot = GC_G(first_unused);
+				GC_G(first_unused)++;
+			} else {
 				if (!GC_G(gc_enabled)) {
 					GC_ZVAL_SET_BLACK(zv);
 					return;
@@ -229,10 +237,9 @@
 				}
 				obj = &EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(zv)].bucket.obj;
 				GC_SET_PURPLE(obj->buffered);
+				GC_G(unused) = newRoot->prev;
 			}
 
-			GC_G(unused) = newRoot->prev;
-
 			newRoot->next = GC_G(roots).next;
 			newRoot->prev = &GC_G(roots);
 			GC_G(roots).next->prev = newRoot;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_gc.h?r1=1.1.2.6&r2=1.1.2.7&diff_format=u
Index: ZendEngine2/zend_gc.h
diff -u ZendEngine2/zend_gc.h:1.1.2.6 ZendEngine2/zend_gc.h:1.1.2.7
--- ZendEngine2/zend_gc.h:1.1.2.6	Fri Mar 14 18:36:34 2008
+++ ZendEngine2/zend_gc.h	Fri Apr 11 17:31:53 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_gc.h,v 1.1.2.6 2008/03/14 18:36:34 dmitry Exp $ */
+/* $Id: zend_gc.h,v 1.1.2.7 2008/04/11 17:31:53 dmitry Exp $ */
 
 #ifndef ZEND_GC_H
 #define ZEND_GC_H
@@ -103,6 +103,8 @@
 	gc_root_buffer   *buf;				/* preallocated arrays of buffers   */
 	gc_root_buffer    roots;			/* list of possible roots of cycles */
 	gc_root_buffer   *unused;			/* list of unused buffers           */
+	gc_root_buffer   *first_unused;		/* pointer to first unused buffer   */
+	gc_root_buffer   *last_unused;		/* pointer to last unused buffer    */
 
 	zval_gc_info     *zval_to_free;		/* temporaryt list of zvals to free */
 	zval_gc_info     *free_list;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.