]> granicus.if.org Git - php/commitdiff
Fixed GC problem (arrays may be recorded as possible root of garbage cycle. we have...
authorDmitry Stogov <dmitry@zend.com>
Mon, 8 Sep 2014 20:12:36 +0000 (00:12 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 8 Sep 2014 20:12:36 +0000 (00:12 +0400)
ext/opcache/zend_persist.c

index b49f28f4e300f6600ecf516865406195c3466476..b34e90578d94fb56855682f3f17b96355d2cead1 100644 (file)
@@ -198,6 +198,9 @@ static void zend_persist_zval(zval *z TSRMLS_DC)
                                        Z_ARR_P(z) = zend_accel_memdup(Z_ARR_P(z), sizeof(zend_array));
                                        zend_hash_persist_immutable(Z_ARRVAL_P(z) TSRMLS_CC);
                                } else {
+                                       if (!zend_shared_alloc_get_xlat_entry(Z_ARR_P(z))) {
+                                               GC_REMOVE_FROM_BUFFER(Z_ARR_P(z));
+                                       }
                                        zend_accel_store(Z_ARR_P(z), sizeof(zend_array));
                                        zend_hash_persist(Z_ARRVAL_P(z), zend_persist_zval TSRMLS_CC);
                                        /* make immutable array */
@@ -251,6 +254,9 @@ static void zend_persist_zval_const(zval *z TSRMLS_DC)
                                        Z_ARR_P(z) = zend_accel_memdup(Z_ARR_P(z), sizeof(zend_array));
                                        zend_hash_persist_immutable(Z_ARRVAL_P(z) TSRMLS_CC);
                                } else {
+                                       if (!zend_shared_alloc_get_xlat_entry(Z_ARR_P(z))) {
+                                               GC_REMOVE_FROM_BUFFER(Z_ARR_P(z));
+                                       }
                                        zend_accel_store(Z_ARR_P(z), sizeof(zend_array));
                                        zend_hash_persist(Z_ARRVAL_P(z), zend_persist_zval TSRMLS_CC);
                                        /* make immutable array */