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;