]> granicus.if.org Git - php/commitdiff
More locking work
authorZeev Suraski <zeev@php.net>
Sat, 10 Jul 1999 09:29:02 +0000 (09:29 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 10 Jul 1999 09:29:02 +0000 (09:29 +0000)
Zend/zend_execute.c
Zend/zend_hash.c

index 8f8a2d7aa2989e1f092332126589203a7df2672d..1de0f784bdd2146bcc221f8638769e20afe9fc9e 100644 (file)
@@ -37,6 +37,7 @@ static void destroy_garbage(HashTable *ht)
 
 #define INC_AI_COUNT(znode_ptr)                if (!((znode_ptr)->u.EA.type & EXT_TYPE_UNUSED)) { EG(AiCount)++; }
 #define DEC_AI_COUNT()         if (--EG(AiCount)==0) { zend_ptr_stack_clean(&EG(garbage), (void (*)(void *)) destroy_garbage); }
+#define SELECTIVE_PZVAL_LOCK(pzv, pzn)         if (!((pzn)->u.EA.type & EXT_TYPE_UNUSED)) { PZVAL_LOCK(pzv); }
 
 #define get_zval_ptr(node, Ts, should_free, type) _get_zval_ptr(node, Ts, should_free ELS_CC)
 #define get_zval_ptr_ptr(node, Ts, type) _get_zval_ptr_ptr(node, Ts ELS_CC)
@@ -346,7 +347,7 @@ static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2
        if (result) {
                Ts[result->u.var].var = variable_ptr_ptr;
                INC_AI_COUNT(result);
-               PZVAL_LOCK(*variable_ptr_ptr);
+               SELECTIVE_PZVAL_LOCK(*variable_ptr_ptr, result);
        } 
 }
 
@@ -447,7 +448,7 @@ static inline void zend_fetch_var_address(znode *result, znode *op1, znode *op2,
        }
        Ts[result->u.var].var = retval; 
        INC_AI_COUNT(result);
-       PZVAL_LOCK(*retval);
+       SELECTIVE_PZVAL_LOCK(*retval, result);
 }
 
 
@@ -608,7 +609,7 @@ static inline void zend_fetch_dimension_address(znode *result, znode *op1, znode
                        } else {
                                *retval = zend_fetch_dimension_address_inner(container->value.ht, op2, Ts, type ELS_CC);
                        }
-                       PZVAL_LOCK(**retval);
+                       SELECTIVE_PZVAL_LOCK(**retval, result);
                        break;
                case IS_STRING: {
                                zval *offset;
@@ -669,7 +670,7 @@ static inline void zend_fetch_dimension_address_from_tmp_var(znode *result, znod
 
        INC_AI_COUNT(result);
        Ts[result->u.var].var = zend_fetch_dimension_address_inner(container->value.ht, op2, Ts, BP_VAR_R ELS_CC);
-       PZVAL_LOCK(*Ts[result->u.var].var);
+       SELECTIVE_PZVAL_LOCK(*Ts[result->u.var].var, result);
 }
 
 
@@ -789,7 +790,7 @@ static inline void zend_fetch_property_address(znode *result, znode *op1, znode
        }
        *retval = zend_fetch_property_address_inner(container->value.obj.properties, op2, Ts, type ELS_CC);
        INC_AI_COUNT(result);
-       PZVAL_LOCK(**retval);
+       SELECTIVE_PZVAL_LOCK(**retval, result);
 }
 
 
@@ -1019,7 +1020,7 @@ binary_assign_op_addr: {
                                        (*var_ptr)->EA.locks = previous_lock_count;
                                        Ts[opline->result.u.var].var = var_ptr;
                                        INC_AI_COUNT(&opline->result);
-                                       PZVAL_LOCK(*var_ptr);
+                                       SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result);
                                        FREE_OP(&opline->op2, free_op2);
                                }
                                break;
@@ -1070,7 +1071,7 @@ binary_assign_op_addr: {
                                                case ZEND_PRE_DEC:
                                                        Ts[opline->result.u.var].var = var_ptr;
                                                        INC_AI_COUNT(&opline->result);
-                                                       PZVAL_LOCK(*var_ptr);
+                                                       SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result);
                                                        break;
                                        }
                                        (*var_ptr)->EA.locks = previous_lock_count;
index edb8da272fe8b04239f4e1b1045f01a1e09a3b44..9e8f102be10e46b3866aa0b8b05148392b80b25b 100644 (file)
@@ -732,7 +732,7 @@ ZEND_API void zend_hash_destroy(HashTable *ht)
                        } else {
                                delete_bucket = 1;
                        }
-                       if (!q->pDataPtr && q->pData) {
+                       if (!q->pDataPtr && q->pData && delete_bucket) {
                                pefree(q->pData,ht->persistent);
                        }
                } else {