From 5dba59439bd430e61a278a23d6f901df65ecc21a Mon Sep 17 00:00:00 2001 From: Xuefer Date: Sun, 3 Sep 2006 07:36:09 +0000 Subject: [PATCH] improve locking for compile git-svn-id: svn://svn.lighttpd.net/xcache/trunk@130 c26eb9a1-5813-0410-bd6c-c2e55f420ca7 --- xcache.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/xcache.c b/xcache.c index 13d8ada..555346e 100644 --- a/xcache.c +++ b/xcache.c @@ -42,18 +42,28 @@ #define CHECK(x, e) do { if ((x) == NULL) { zend_error(E_ERROR, "XCache: " e); goto err; } } while (0) #define LOCK(x) xc_lock(x->lck) #define UNLOCK(x) xc_unlock(x->lck) -#define ENTER_LOCK(x) do { \ - int catched = 0; \ + +#define ENTER_LOCK_EX(x) \ xc_lock(x->lck); \ zend_try { \ do -#define LEAVE_LOCK(x) \ +#define LEAVE_LOCK_EX(x) \ while (0); \ } zend_catch { \ catched = 1; \ } zend_end_try(); \ - xc_unlock(x->lck); \ + xc_unlock(x->lck) + +#define ENTER_LOCK(x) do { \ + int catched = 0; \ + ENTER_LOCK_EX(x) +#define LEAVE_LOCK(x) \ + LEAVE_LOCK_EX(x); \ + if (catched) { \ + zend_bailout(); \ + } \ } while(0) + /* }}} */ /* {{{ globals */ @@ -762,7 +772,7 @@ static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) / stored_xce = NULL; op_array = NULL; - ENTER_LOCK(cache) { + ENTER_LOCK_EX(cache) { /* clogged */ if (cache->compiling) { cache->clogs ++; @@ -784,7 +794,12 @@ static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) / cache->compiling = XG(request_time); cache->misses ++; - } LEAVE_LOCK(cache); + } LEAVE_LOCK_EX(cache); + + if (catched) { + cache->compiling = 0; + zend_bailout(); + } /* found */ if (stored_xce) { @@ -898,9 +913,9 @@ static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) / /* for ZE1, cest need to fix inside store */ } /* }}} */ - ENTER_LOCK(cache) { /* {{{ store/add entry */ + ENTER_LOCK_EX(cache) { /* {{{ store/add entry */ stored_xce = xc_entry_store_dmz(&xce TSRMLS_CC); - } LEAVE_LOCK(cache); + } LEAVE_LOCK_EX(cache); /* }}} */ #ifdef DEBUG fprintf(stderr, "stored\n");