]> granicus.if.org Git - php/commitdiff
Fixed GC slowdown
authorDmitry Stogov <dmitry@php.net>
Tue, 29 Apr 2008 13:43:49 +0000 (13:43 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 29 Apr 2008 13:43:49 +0000 (13:43 +0000)
Zend/zend_gc.c

index 92bf4272ea679bcea3b6b2222d8ea3fc091a48f3..0ae4a2a13fdf5caa7a214cad2ab17acaf68e3b19 100644 (file)
@@ -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);