mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00
MFB.
This commit is contained in:
parent
616d49aaf6
commit
ace6ff598c
1 changed files with 10 additions and 50 deletions
|
@ -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. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue