Changed zend_smart_str allocation granularity to do the better job together with...
authorDmitry Stogov <dmitry@zend.com>
Thu, 16 Apr 2015 09:32:56 +0000 (12:32 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 16 Apr 2015 09:32:56 +0000 (12:32 +0300)
Zend/zend_alloc.c
Zend/zend_alloc.h
Zend/zend_smart_str.h

index 6701ca49028b55e33893fc2ae8fee56d0a66ce5f..16fd42e80f1ebc3388ca84ea68498c7604225ef2 100644 (file)
@@ -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;
 };
index 6d89884f0dbd1de457b540e8cfd5af926d2669e3..0cb3a71d345f94e3cf6ebf55dd30c31d5aedb845 100644 (file)
@@ -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;
index c18b133dfec3461502ba41aa0ab9647fcabadc58..4a37dd66f04820a6a87adec1ab2c1ee4932961ed 100644 (file)
 #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;