From ef38483ca37796fd1c7b7f0021c9f90482cd14e7 Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Wed, 25 Aug 2004 20:47:40 +0000 Subject: [PATCH] Rewrite cache clean-up using zend_hash_apply_with_argument(). --- ext/pcre/php_pcre.c | 60 ++++++++------------------------------------- 1 file changed, 10 insertions(+), 50 deletions(-) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index bf92e96e59..d907811908 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -111,57 +111,16 @@ static PHP_MSHUTDOWN_FUNCTION(pcre) #define PCRE_CACHE_SIZE 4096 /* {{{ static pcre_clean_cache */ -static void pcre_clean_cache(TSRMLS_D) +static int pcre_clean_cache(void *data, void *arg TSRMLS_DC) { - HashTable *ht = &PCRE_G(pcre_cache); - Bucket *p = NULL; - int clean_size = PCRE_CACHE_SIZE / 8; + int *num_clean = (int *)arg; - HANDLE_BLOCK_INTERRUPTIONS(); - - do { - p = ht->pListHead; - - if (ht->pDestructor) { - ht->pDestructor(p->pData); - } - if (!p->pDataPtr) { - pefree(p->pData, ht->persistent); - } - - if (p->pLast) { - p->pLast->pNext = p->pNext; - } else { - uint nIndex; - - nIndex = p->h & ht->nTableMask; - ht->arBuckets[nIndex] = p->pNext; - } - if (p->pNext) { - p->pNext->pLast = p->pLast; - } else { - /* Nothing to do as this list doesn't have a tail */ - } - - if (p->pListLast != NULL) { - p->pListLast->pListNext = p->pListNext; - } else { - /* Deleting the head of the list */ - ht->pListHead = p->pListNext; - } - if (p->pListNext != NULL) { - p->pListNext->pListLast = p->pListLast; - } else { - ht->pListTail = p->pListLast; - } - if (ht->pInternalPointer == p) { - ht->pInternalPointer = p->pListNext; - } - pefree(p, ht->persistent); - ht->nNumOfElements--; - } while (ht->nNumOfElements > PCRE_CACHE_SIZE - clean_size); - - HANDLE_UNBLOCK_INTERRUPTIONS(); + if (*num_clean > 0) { + (*num_clean)--; + return 1; + } else { + return 0; + } } /* }}} */ @@ -342,7 +301,8 @@ PHPAPI pcre* pcre_get_compiled_regex(char *regex, pcre_extra **extra, int *preg_ * ones). */ if (zend_hash_num_elements(&PCRE_G(pcre_cache)) == PCRE_CACHE_SIZE) { - pcre_clean_cache(TSRMLS_C); + int num_clean = PCRE_CACHE_SIZE / 8; + zend_hash_apply_with_argument(&PCRE_G(pcre_cache), pcre_clean_cache, &num_clean TSRMLS_CC); } /* Store the compiled pattern and extra info in the cache. */ -- 2.40.0