diff --git a/xcache.c b/xcache.c index 8af66e1..5bae072 100644 --- a/xcache.c +++ b/xcache.c @@ -839,7 +839,7 @@ static inline void xc_entry_unholds_real(xc_stack_t *holds, xc_cache_t **caches, while (xc_stack_count(s)) { entry_php = (xc_entry_php_t *) xc_stack_pop(s); TRACE("unhold %d:%s", entry_php->file_inode, entry_php->entry.name.str.val); - entry_php->refcount ++; + --entry_php->refcount; assert(entry_php->refcount >= 0); } } LEAVE_LOCK(cache); @@ -1939,11 +1939,16 @@ static zend_op_array *xc_compile_file_ex(xc_compiler_t *compiler, zend_file_hand if (stored_php) { compiler->new_entry.php = stored_php; - xc_php_addref_unlocked(stored_php); xc_entry_php_init(&compiler->new_entry, compiler->opened_path TSRMLS_CC); stored_entry = xc_entry_php_store_unlocked(cache, compiler->entry_hash.entryslotid, &compiler->new_entry TSRMLS_CC); - TRACE(" cached %d:%s, holding", compiler->new_entry.file_inode, stored_entry->entry.name.str.val); - xc_entry_hold_php_unlocked(cache, stored_entry TSRMLS_CC); + if (stored_entry) { + xc_php_addref_unlocked(stored_php); + TRACE(" cached %d:%s, holding", compiler->new_entry.file_inode, stored_entry->entry.name.str.val); + xc_entry_hold_php_unlocked(cache, stored_entry TSRMLS_CC); + } + else { + gaveup = 1; + } break; } @@ -2021,10 +2026,11 @@ static zend_op_array *xc_compile_file_ex(xc_compiler_t *compiler, zend_file_hand } /* entry_store */ compiler->new_entry.php = stored_php; - xc_php_addref_unlocked(stored_php); stored_entry = xc_entry_php_store_unlocked(cache, compiler->entry_hash.entryslotid, &compiler->new_entry TSRMLS_CC); - if (!stored_entry) { - xc_php_release_unlocked(cache, stored_php); + if (stored_entry) { + xc_php_addref_unlocked(stored_php); + TRACE(" cached %d:%s, holding", compiler->new_entry.file_inode, stored_entry->entry.name.str.val); + xc_entry_hold_php_unlocked(cache, stored_entry TSRMLS_CC); } } LEAVE_LOCK_EX(cache); /* }}} */