summaryrefslogtreecommitdiff
path: root/ext/pcre/php_pcre.c
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2004-08-25 20:48:48 +0000
committerAndrei Zmievski <andrei@php.net>2004-08-25 20:48:48 +0000
commitace6ff598cafda176cc39bb886e11f95ffd4f20c (patch)
treef54fbc2054121a28e1fc3d72a0545ffb5500c779 /ext/pcre/php_pcre.c
parent616d49aaf6b3a09d946cd732b07b1c27bbe85942 (diff)
downloadphp-git-ace6ff598cafda176cc39bb886e11f95ffd4f20c.tar.gz
MFB.
Diffstat (limited to 'ext/pcre/php_pcre.c')
-rw-r--r--ext/pcre/php_pcre.c60
1 files changed, 10 insertions, 50 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index 0faf08d5da..6f5a7aea66 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;
+ }
}
/* }}} */
@@ -353,7 +312,8 @@ PHPAPI pcre* pcre_get_compiled_regex_ex(char *regex, pcre_extra **extra, int *pr
* 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. */