Re: cvs: php-src(PHP_4_3) / NEWS /ext/pcre php_pcre.c
| From: | Andi Gutmans | Date: | Tue, 24 Aug 2004 23:36:03 +0000 |
| Subject: | Re: cvs: php-src(PHP_4_3) / NEWS /ext/pcre php_pcre.c | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-28436@lists.php.net to get a copy of this message | ||
Can't you use zend_hash_apply() for this? I know it might be slightly slower but I don't think it'd be noticable. Copy&pasting the hash code is a problem because if we change the hash code this part would probably not be maintained (at least not automatically).
Andi
At 08:57 PM 8/24/2004 +0000, Andrei Zmievski wrote:
andrei Tue Aug 24 16:57:33 2004 EDTModified files: (Branch: PHP_4_3) /php-src NEWS /php-src/ext/pcre php_pcre.cLog: Implement periodic PCRE compiled regexp cache cleanup, to avoid memory exhaustion. http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1247.2.721&r2=1.1247.2.722&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1247.2.721 php-src/NEWS:1.1247.2.722 --- php-src/NEWS:1.1247.2.721 Thu Aug 19 20:46:49 2004+++ php-src/NEWS Tue Aug 24 16:57:32 2004@@ -1,6 +1,8 @@ PHP4 NEWS||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2004, Version 4.3.9 +- Implemented periodic PCRE compiled regexp cache cleanup, to avoid memory + exhaustion. (Andrei) - Fixed bug with raw_post_data not getting set (Brian) - Fixed a file-descriptor leak with phpinfo() and other 'special' URLs (Zeev) - Fixed bug #29753 (mcal_fetch_event() allows 2nd argument to be optional). http://cvs.php.net/diff.php/php-src/ext/pcre/php_pcre.c?r1=1.132.2.18&r2=1.132.2.19&ty=u Index: php-src/ext/pcre/php_pcre.c diff -u php-src/ext/pcre/php_pcre.c:1.132.2.18 php-src/ext/pcre/php_pcre.c:1.132.2.19--- php-src/ext/pcre/php_pcre.c:1.132.2.18 Tue Jun 22 18:20:38 2004+++ php-src/ext/pcre/php_pcre.c Tue Aug 24 16:57:32 2004 @@ -16,7 +16,7 @@+----------------------------------------------------------------------+*/ -/* $Id: php_pcre.c,v 1.132.2.18 2004/06/22 22:20:38 andrei Exp $ */ +/* $Id: php_pcre.c,v 1.132.2.19 2004/08/24 20:57:32 andrei Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -108,6 +108,63 @@ } /* }}} */ +#define PCRE_CACHE_SIZE 4096 + +/* {{{ static pcre_clean_cache */ +static void pcre_clean_cache() +{+ HashTable *ht = &PCRE_G(pcre_cache); + Bucket *p = NULL; + int clean_size = PCRE_CACHE_SIZE / 8;++ 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();+} +/* }}} */ + /* {{{ pcre_get_compiled_regex */ PHPAPI pcre* pcre_get_compiled_regex(char *regex, pcre_extra **extra, int *preg_options) { @@ -278,6 +335,15 @@*preg_options = poptions;efree(pattern);++ /* + * If we reached cache limit, clean out the items from the head of the list; + * these are supposedly the oldest ones (but not necessarily the least used + * ones). + */ + if (zend_hash_num_elements(&PCRE_G(pcre_cache)) == PCRE_CACHE_SIZE) { + pcre_clean_cache(); + }/* Store the compiled pattern and extra info in the cache. */ new_entry.re = re;-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php