mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Changed zend_smart_str allocation granularity to do the better job together with Zend MM and avoid useless calls to erealloc().
This commit is contained in:
parent
a759967dd1
commit
5275e5560b
3 changed files with 25 additions and 16 deletions
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue