diff options
-rw-r--r-- | Zend/zend_alloc.c | 10 | ||||
-rw-r--r-- | Zend/zend_alloc.h | 14 | ||||
-rw-r--r-- | Zend/zend_smart_str.h | 17 |
3 files changed, 25 insertions, 16 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 6701ca4902..16fd42e80f 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -287,16 +287,6 @@ struct _zend_mm_bin { char bytes[ZEND_MM_PAGE_SIZE * 8]; }; -#if ZEND_DEBUG -typedef struct _zend_mm_debug_info { - size_t size; - const char *filename; - const char *orig_filename; - uint lineno; - uint orig_lineno; -} zend_mm_debug_info; -#endif - struct _zend_mm_free_slot { zend_mm_free_slot *next_free_slot; }; diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index 6d89884f0d..0cb3a71d34 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -50,6 +50,20 @@ typedef struct _zend_leak_info { uint orig_lineno; } zend_leak_info; +#if ZEND_DEBUG +typedef struct _zend_mm_debug_info { + size_t size; + const char *filename; + const char *orig_filename; + uint lineno; + uint orig_lineno; +} zend_mm_debug_info; + +# define ZEND_MM_OVERHEAD ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_debug_info)) +#else +# define ZEND_MM_OVERHEAD 0 +#endif + BEGIN_EXTERN_C() ZEND_API char* ZEND_FASTCALL zend_strndup(const char *s, size_t length) ZEND_ATTRIBUTE_MALLOC; diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h index c18b133dfe..4a37dd66f0 100644 --- a/Zend/zend_smart_str.h +++ b/Zend/zend_smart_str.h @@ -22,14 +22,19 @@ #include <zend.h> #include "zend_smart_str_public.h" -#ifndef SMART_STR_PREALLOC -#define SMART_STR_PREALLOC 128 +#define SMART_STR_OVERHEAD (ZEND_MM_OVERHEAD + _STR_HEADER_SIZE) + +#ifndef SMART_STR_PAGE +# define SMART_STR_PAGE 4096 #endif #ifndef SMART_STR_START_SIZE -#define SMART_STR_START_SIZE 78 +# define SMART_STR_START_SIZE (256 - SMART_STR_OVERHEAD - 1) #endif +#define SMART_STR_NEW_SIZE(newlen) \ + (((newlen + SMART_STR_OVERHEAD + SMART_STR_PAGE) & ~(SMART_STR_PAGE - 1)) - SMART_STR_OVERHEAD - 1) + #define smart_str_appends_ex(dest, src, what) \ smart_str_appendl_ex((dest), (src), strlen(src), (what)) #define smart_str_appends(dest, src) \ @@ -55,14 +60,14 @@ static zend_always_inline size_t smart_str_alloc(smart_str *str, size_t len, zen newlen = len; str->a = newlen < SMART_STR_START_SIZE ? SMART_STR_START_SIZE - : newlen + SMART_STR_PREALLOC; + : SMART_STR_NEW_SIZE(newlen); str->s = zend_string_alloc(str->a, persistent); str->s->len = 0; } else { newlen = str->s->len + len; if (newlen >= str->a) { - str->a = newlen + SMART_STR_PREALLOC; - str->s = (zend_string *) perealloc(str->s, _STR_HEADER_SIZE + str->a + 1, persistent); + str->a = SMART_STR_NEW_SIZE(newlen); + str->s = (zend_string *) perealloc2(str->s, _STR_HEADER_SIZE + str->a + 1, _STR_HEADER_SIZE + str->s->len + 1, persistent); } } return newlen; |