diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2017-10-27 01:28:58 +0300 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2017-10-27 01:28:58 +0300 |
| commit | 49ea143bbd8d0bfcd393d0b5308a5d7833fc087c (patch) | |
| tree | 071b08e8067e5a6a1e9726e3d76dfe81cc42d6b0 /Zend/zend_execute.h | |
| parent | 1ab0d820dabc612b7d371d6ed524f60f68101d0f (diff) | |
| download | php-git-49ea143bbd8d0bfcd393d0b5308a5d7833fc087c.tar.gz | |
Encapsulate reference-counting primitives.
Prohibit direct update of GC_REFCOUNT(), GC_SET_REFCOUNT(), GC_ADDREF() and GC_DELREF() shoukf be instead.
Added mactros to validate reference-counting (disabled for now).
These macros are going to be used to eliminate race-condintions during reference-counting on data shared between threads.
Diffstat (limited to 'Zend/zend_execute.h')
| -rw-r--r-- | Zend/zend_execute.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 39fce43ccc..44524beded 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -85,19 +85,19 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval if (ZEND_CONST_COND(value_type & (IS_VAR|IS_CV), 1) && variable_ptr == value) { if (value_type == IS_VAR && ref) { ZEND_ASSERT(GC_REFCOUNT(ref) > 1); - --GC_REFCOUNT(ref); + GC_DELREF(ref); } return variable_ptr; } garbage = Z_COUNTED_P(variable_ptr); - if (--GC_REFCOUNT(garbage) == 0) { + if (GC_DELREF(garbage) == 0) { ZVAL_COPY_VALUE(variable_ptr, value); if (value_type & (IS_CONST|IS_CV)) { if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) { Z_ADDREF_P(variable_ptr); } } else if (ZEND_CONST_COND(value_type == IS_VAR, 1) && UNEXPECTED(ref)) { - if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) { + if (UNEXPECTED(GC_DELREF(ref) == 0)) { efree_size(ref, sizeof(zend_reference)); } else if (Z_OPT_REFCOUNTED_P(variable_ptr)) { Z_ADDREF_P(variable_ptr); @@ -120,7 +120,7 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval Z_ADDREF_P(variable_ptr); } } else if (ZEND_CONST_COND(value_type == IS_VAR, 1) && UNEXPECTED(ref)) { - if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) { + if (UNEXPECTED(GC_DELREF(ref) == 0)) { efree_size(ref, sizeof(zend_reference)); } else if (Z_OPT_REFCOUNTED_P(variable_ptr)) { Z_ADDREF_P(variable_ptr); @@ -223,7 +223,7 @@ static zend_always_inline void zend_vm_stack_free_extra_args_ex(uint32_t call_in p--; if (Z_REFCOUNTED_P(p)) { zend_refcounted *r = Z_COUNTED_P(p); - if (!--GC_REFCOUNT(r)) { + if (!GC_DELREF(r)) { ZVAL_NULL(p); zval_dtor_func(r); } else { |
