]> granicus.if.org Git - php/commitdiff
Changed memory_get_usage() and memory_get_peak_usage(). Optional boolean argument...
authorDmitry Stogov <dmitry@php.net>
Tue, 25 Jul 2006 13:40:05 +0000 (13:40 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 25 Jul 2006 13:40:05 +0000 (13:40 +0000)
NEWS
Zend/zend_alloc.c
Zend/zend_alloc.h
ext/standard/var.c
sapi/apache/mod_php5.c
sapi/apache2filter/sapi_apache2.c
sapi/apache2handler/sapi_apache2.c
sapi/apache_hooks/mod_php5.c

diff --git a/NEWS b/NEWS
index b855058a64fba521d1d2d531c5cabde56af31eb5..c0ec779bfe0875356cd4c5f8f2baa873f84a4ef8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,10 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Aug 2006, PHP 5.2.0RC2
+- Changed memory_get_usage() and memory_get_peak_usage(). Optional boolean
+  argument allows get memory size allocated by emalloc() (by default) or
+  real size of memory allocated from system. (Dmitry)
+
 - Moved extensions to PECL:
   . ext/filepro (Derick, Tony)
   . ext/hwapi (Derick, Tony)
index 1ebe1012f701692dd276bf691566941911413bc8..1a04bc39538581ccfeb833edc98a7bb64cc79aa2 100644 (file)
@@ -312,10 +312,12 @@ struct _zend_mm_heap {
        size_t              block_size;
        zend_mm_segment    *segments_list;
        zend_mm_storage    *storage;
-       size_t                          size;
+       size_t                          real_size;
 #if MEMORY_LIMIT
-       size_t              peak;
+       size_t              real_peak;
        size_t                          limit;
+       size_t              size;
+       size_t              peak;
 #endif
 #if ZEND_USE_MALLOC_MM
        int                                     use_zend_alloc;
@@ -514,7 +516,7 @@ static void zend_mm_del_segment(zend_mm_heap *heap, zend_mm_segment *segment)
                        p = p->next_segment;
                }
        }
-       heap->size -= segment->size;
+       heap->real_size -= segment->size;
        ZEND_MM_STORAGE_FREE(segment);
 }
 
@@ -595,10 +597,12 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers,
        heap->use_zend_alloc = 1;
 #endif
 
-       heap->size = 0;
+       heap->real_size = 0;
 #if MEMORY_LIMIT
-       heap->peak = 0;
+       heap->real_peak = 0;
        heap->limit = 1<<30;
+       heap->size = 0;
+       heap->peak = 0;
 #endif
 
        heap->overflow = 0;
@@ -996,8 +1000,10 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, int full_shutdown, int silent
        } else {
                heap->segments_list = NULL;
                zend_mm_init(heap);
-               heap->size = 0;
+               heap->real_size = 0;
 #if MEMORY_LIMIT
+               heap->real_peak = 0;
+               heap->size = 0;
                heap->peak = 0;
 #endif
                heap->overflow = 0;
@@ -1175,7 +1181,7 @@ zend_mm_finished_searching_for_block:
 
 
 #if MEMORY_LIMIT
-               if (heap->size + segment_size > heap->limit) {
+               if (heap->real_size + segment_size > heap->limit) {
                        /* Memory limit overflow */
 #if ZEND_DEBUG
                        zend_mm_safe_error(heap, "Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes)", heap->limit, __zend_filename, __zend_lineno, size);
@@ -1196,17 +1202,17 @@ zend_mm_finished_searching_for_block:
 #endif
                        HANDLE_UNBLOCK_INTERRUPTIONS();
 #if ZEND_DEBUG
-                       zend_mm_safe_error(heap, "Out of memory (allocated %d) at %s:%d (tried to allocate %d bytes)", heap->size, __zend_filename, __zend_lineno, size);
+                       zend_mm_safe_error(heap, "Out of memory (allocated %d) at %s:%d (tried to allocate %d bytes)", heap->real_size, __zend_filename, __zend_lineno, size);
 #else
-                       zend_mm_safe_error(heap, "Out of memory (allocated %d) (tried to allocate %d bytes)", heap->size, size);
+                       zend_mm_safe_error(heap, "Out of memory (allocated %d) (tried to allocate %d bytes)", heap->real_size, size);
 #endif
                        return NULL;
                }
 
-               heap->size += segment_size;
+               heap->real_size += segment_size;
 #if MEMORY_LIMIT
-               if (heap->size > heap->peak) {
-                       heap->peak = heap->size;
+               if (heap->real_size > heap->real_peak) {
+                       heap->real_peak = heap->real_size;
                }
 #endif
 
@@ -1242,6 +1248,14 @@ zend_mm_finished_searching_for_block:
 # endif
        ZEND_MM_SET_END_MAGIC(best_fit);
 #endif
+
+#if MEMORY_LIMIT
+       heap->size += true_size;
+       if (heap->peak < heap->size) {
+               heap->peak = heap->size;
+       }
+#endif
+
        HANDLE_UNBLOCK_INTERRUPTIONS();
 
        return ZEND_MM_DATA_OF(best_fit);
@@ -1278,6 +1292,11 @@ static void _zend_mm_free_int(zend_mm_heap *heap, void *p ZEND_FILE_LINE_DC ZEND
 #endif
 
        HANDLE_BLOCK_INTERRUPTIONS();
+
+#if MEMORY_LIMIT
+       heap->size -= size;
+#endif
+
        if (ZEND_MM_PREV_BLOCK_IS_FREE(mm_block)) {
                next_block = ZEND_MM_NEXT_BLOCK(mm_block);
                if (ZEND_MM_IS_FREE_BLOCK(next_block)) {
@@ -1349,6 +1368,14 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
        }
        mm_block = ZEND_MM_HEADER_OF(p);
        true_size = ZEND_MM_TRUE_SIZE(size);
+
+#if MEMORY_LIMIT
+       heap->size = heap->size + true_size - ZEND_MM_BLOCK_SIZE(mm_block);
+       if (heap->peak < heap->size) {
+               heap->peak = heap->size;
+       }
+#endif
+       
        if (true_size <= ZEND_MM_BLOCK_SIZE(mm_block)) {
                size_t remaining_size = ZEND_MM_BLOCK_SIZE(mm_block) - true_size;
 
@@ -1439,7 +1466,7 @@ realloc_segment:
 
                segment_copy = (zend_mm_segment *) ((char *)mm_block - ZEND_MM_ALIGNED_SEGMENT_SIZE);
 #if MEMORY_LIMIT
-               if (heap->size + segment_size - segment_copy->size > heap->limit) {
+               if (heap->real_size + segment_size - segment_copy->size > heap->limit) {
                        HANDLE_UNBLOCK_INTERRUPTIONS();
 #if ZEND_DEBUG
                        zend_mm_safe_error(heap, "Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes)", heap->limit, __zend_filename, __zend_lineno, size);
@@ -1453,16 +1480,16 @@ realloc_segment:
                if (!segment) {
                        HANDLE_UNBLOCK_INTERRUPTIONS();
 #if ZEND_DEBUG
-                       zend_mm_safe_error(heap, "Out of memory (allocated %d) at %s:%d (tried to allocate %d bytes)", heap->size, __zend_filename, __zend_lineno, size);
+                       zend_mm_safe_error(heap, "Out of memory (allocated %d) at %s:%d (tried to allocate %d bytes)", heap->real_size, __zend_filename, __zend_lineno, size);
 #else
-                       zend_mm_safe_error(heap, "Out of memory (allocated %d) (tried to allocate %d bytes)", heap->size, size);
+                       zend_mm_safe_error(heap, "Out of memory (allocated %d) (tried to allocate %d bytes)", heap->real_size, size);
 #endif
                        return NULL;
                }
-               heap->size += segment_size - segment->size;
+               heap->real_size += segment_size - segment->size;
 #if MEMORY_LIMIT
-               if (heap->size > heap->peak) {
-                       heap->peak = heap->size;
+               if (heap->real_size > heap->real_peak) {
+                       heap->real_peak = heap->real_size;
                }
 #endif
                segment->size = segment_size;
@@ -1736,15 +1763,27 @@ ZEND_API int zend_set_memory_limit(unsigned int memory_limit)
 #endif
 }
 
-ZEND_API size_t zend_memory_usage(TSRMLS_D)
+ZEND_API size_t zend_memory_usage(int real_usage TSRMLS_DC)
 {
-       return AG(mm_heap)->size;
+       if (real_usage) {
+               return AG(mm_heap)->real_size;
+       } else {
+#if MEMORY_LIMIT
+               return AG(mm_heap)->size;
+#else
+               return AG(mm_heap)->real_size;
+#endif
+       }
 }
 
 #if MEMORY_LIMIT
-ZEND_API size_t zend_memory_peak_usage(TSRMLS_D)
+ZEND_API size_t zend_memory_peak_usage(int real_usage TSRMLS_DC)
 {
-       return AG(mm_heap)->peak;
+       if (real_usage) {
+               return AG(mm_heap)->real_peak;
+       } else {
+               return AG(mm_heap)->peak;
+       }
 }
 #endif
 
index 6a0851c98fbaeec9d62341b18766314b77a12f4d..c8eecb99e90cbc0e046f372186057430c06c817b 100644 (file)
@@ -108,8 +108,8 @@ void zend_debug_alloc_output(char *format, ...);
 #endif
 
 #if MEMORY_LIMIT
-ZEND_API size_t zend_memory_usage(TSRMLS_D);
-ZEND_API size_t zend_memory_peak_usage(TSRMLS_D);
+ZEND_API size_t zend_memory_usage(int real_usage TSRMLS_DC);
+ZEND_API size_t zend_memory_peak_usage(int real_usage TSRMLS_DC);
 #endif
 
 END_EXTERN_C()
index f88d4ff39df43bdeb5b089600b53cb24521b0a1c..bfc61a0ea494f9b404576f99ce33da46ea6cd061 100644 (file)
@@ -912,14 +912,25 @@ PHP_FUNCTION(unserialize)
 /* {{{ proto int memory_get_usage()
     Returns the allocated by PHP memory */
 PHP_FUNCTION(memory_get_usage) {
+       zend_bool real_usage = 0;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &real_usage) == FAILURE) {
+               RETURN_FALSE;
+       }
        
-       RETURN_LONG(zend_memory_usage(TSRMLS_C));
+       RETURN_LONG(zend_memory_usage(real_usage TSRMLS_CC));
 }
 /* }}} */
 /* {{{ proto int memory_get_peak_usage()
     Returns the peak allocated by PHP memory */
 PHP_FUNCTION(memory_get_peak_usage) {
-       RETURN_LONG(zend_memory_peak_usage(TSRMLS_C));
+       zend_bool real_usage = 0;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &real_usage) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       RETURN_LONG(zend_memory_peak_usage(real_usage TSRMLS_CC));
 }
 /* }}} */
 #endif
index e661fdb4b049a2e5de4b0f82add7f19283afe7c3..12ae84b89e25a3ca279b7bf3b7ee5267042719c1 100644 (file)
@@ -684,7 +684,7 @@ static int send_parsed_php(request_rec * r)
                char *mem_usage;
                TSRMLS_FETCH();
  
-               mem_usage = ap_psprintf(r->pool, "%u", zend_memory_peak_usage(TSRMLS_C));
+               mem_usage = ap_psprintf(r->pool, "%u", zend_memory_peak_usage(1 TSRMLS_CC));
                ap_table_setn(r->notes, "mod_php_memory_usage", mem_usage);
        }
 #endif
index 4e7c61411c225d0ebf3b1a7081cb2bef50f4007f..453a8e51b9db062610f8ec7d98cd00e4dc8f4913 100644 (file)
@@ -526,7 +526,7 @@ static int php_output_filter(ap_filter_t *f, apr_bucket_brigade *bb)
        {
                char *mem_usage;
 
-               mem_usage = apr_psprintf(ctx->r->pool, "%u", zend_memory_peak_usage(TSRMLS_C));
+               mem_usage = apr_psprintf(ctx->r->pool, "%u", zend_memory_peak_usage(1 TSRMLS_CC));
                apr_table_set(ctx->r->notes, "mod_php_memory_usage", mem_usage);
        }
 #endif
index f2c4956e8b32f91f8aeb7ec2f1529073ed35e380..bed3a5a973014c3c99bad2927cdf0985e57e6669 100644 (file)
@@ -598,7 +598,7 @@ zend_first_try {
                {
                        char *mem_usage;
 
-                       mem_usage = apr_psprintf(ctx->r->pool, "%u", zend_memory_peak_usage(TSRMLS_C));
+                       mem_usage = apr_psprintf(ctx->r->pool, "%u", zend_memory_peak_usage(1 TSRMLS_CC));
                        apr_table_set(r->notes, "mod_php_memory_usage", mem_usage);
                }
 #endif
index 5ef0181e7d832f0e5c7b3d39e8537b9dec532187..fcdb4d44f75697cce31eab46080496a095de2d73 100644 (file)
@@ -742,7 +742,7 @@ static int send_parsed_php(request_rec * r)
                char *mem_usage;
                TSRMLS_FETCH();
  
-               mem_usage = ap_psprintf(r->pool, "%u", zend_memory_peak_usage(TSRMLS_C));
+               mem_usage = ap_psprintf(r->pool, "%u", zend_memory_peak_usage(1 TSRMLS_CC));
                ap_table_setn(r->notes, "mod_php_memory_usage", mem_usage);
        }
 #endif