diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-11-15 16:31:22 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-11-15 16:31:22 +0300 |
commit | 9ab3b42888c426befc5f4930d9a209fe679f67b0 (patch) | |
tree | 368ae46a8e3d2a9c384cbec4f45dd7edf11d4b52 /Zend/zend_objects_API.c | |
parent | 35a9ec1b0d528a845fa5ea06bdc3f9f3f5e61dcc (diff) | |
download | php-git-9ab3b42888c426befc5f4930d9a209fe679f67b0.tar.gz |
Split zend_objects_store_put() into hot/cold parts
Diffstat (limited to 'Zend/zend_objects_API.c')
-rw-r--r-- | Zend/zend_objects_API.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index b3e4356a2c..afa9359289 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -123,6 +123,18 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_ /* Store objects API */ +static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_objects_store_put_cold(zend_object *object) +{ + int handle; + uint32_t new_size = 2 * EG(objects_store).size; + + EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*)); + /* Assign size after realloc, in case it fails */ + EG(objects_store).size = new_size; + handle = EG(objects_store).top++; + object->handle = handle; + EG(objects_store).object_buckets[handle] = object; +} ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object) { @@ -134,13 +146,10 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object) if (EG(objects_store).free_list_head != -1 && EXPECTED(!(EG(flags) & EG_FLAGS_IN_SHUTDOWN))) { handle = EG(objects_store).free_list_head; EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]); + } else if (UNEXPECTED(EG(objects_store).top == EG(objects_store).size)) { + zend_objects_store_put_cold(object); + return; } else { - if (UNEXPECTED(EG(objects_store).top == EG(objects_store).size)) { - uint32_t new_size = 2 * EG(objects_store).size; - EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*)); - /* Assign size after realloc, in case it fails */ - EG(objects_store).size = new_size; - } handle = EG(objects_store).top++; } object->handle = handle; |