diff options
author | Dmitry Stogov <dmitry@php.net> | 2008-04-29 13:43:49 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2008-04-29 13:43:49 +0000 |
commit | 2396f40eb54176170395f38b01c0287dfc7386f4 (patch) | |
tree | ddf49b745e27a4b6899363907b346b9077a2463f /Zend/zend_gc.c | |
parent | 8a970147ad47bf51f057d7b84c4ab4dbeccdeb0c (diff) | |
download | php-git-2396f40eb54176170395f38b01c0287dfc7386f4.tar.gz |
Fixed GC slowdown
Diffstat (limited to 'Zend/zend_gc.c')
-rw-r--r-- | Zend/zend_gc.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 92bf4272ea..0ae4a2a13f 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -137,15 +137,12 @@ ZEND_API void gc_zval_possible_root(zval *zv TSRMLS_DC) { if (UNEXPECTED(GC_G(free_list) != NULL && GC_ZVAL_ADDRESS(zv) != NULL && - GC_ZVAL_GET_COLOR(zv) == GC_BLACK)) { - zval_gc_info **p = &GC_G(free_list); - - while (*p != NULL) { - if (*p == (zval_gc_info*)zv) { - return; - } - p = &(*p)->u.next; - } + GC_ZVAL_GET_COLOR(zv) == GC_BLACK) && + (GC_ZVAL_ADDRESS(zv) < GC_G(buf) || + GC_ZVAL_ADDRESS(zv) >= GC_G(last_unused))) { + /* The given zval is a gurbage that is going to be delated by + * currently running GC */ + return; } if (zv->type == IS_OBJECT) { @@ -261,19 +258,15 @@ ZEND_API void gc_remove_zval_from_buffer(zval *zv) TSRMLS_FETCH(); if (UNEXPECTED(GC_G(free_list) != NULL && - GC_ZVAL_GET_COLOR(zv) == GC_BLACK)) { - zval_gc_info **p = &GC_G(free_list); - - while (*p != NULL) { - if (*p == (zval_gc_info*)zv) { - if (GC_G(next_to_free) == (zval_gc_info*)zv) { - GC_G(next_to_free) = ((zval_gc_info*)zv)->u.next; - } - *p = (*p)->u.next; - return; - } - p = &(*p)->u.next; + GC_ZVAL_GET_COLOR(zv) == GC_BLACK) && + (GC_ZVAL_ADDRESS(zv) < GC_G(buf) || + GC_ZVAL_ADDRESS(zv) >= GC_G(last_unused))) { + /* The given zval is a gurbage that is going to be delated by + * currently running GC */ + if (GC_G(next_to_free) == (zval_gc_info*)zv) { + GC_G(next_to_free) = ((zval_gc_info*)zv)->u.next; } + return; } GC_BENCH_INC(zval_remove_from_buffer); GC_REMOVE_FROM_BUFFER(root_buffer); |