Andi
At 08:57 PM 8/24/2004 +0000, Andrei Zmievski wrote:
andrei Tue Aug 24 16:57:33 2004 EDT
Modified files: (Branch: PHP_4_3) /php-src NEWS /php-src/ext/pcre php_pcre.c Log: 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 @@
PHP 4 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
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
