summaryrefslogtreecommitdiff
path: root/Zend/zend_objects_API.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-11-15 16:31:22 +0300
committerDmitry Stogov <dmitry@zend.com>2018-11-15 16:31:22 +0300
commit9ab3b42888c426befc5f4930d9a209fe679f67b0 (patch)
tree368ae46a8e3d2a9c384cbec4f45dd7edf11d4b52 /Zend/zend_objects_API.c
parent35a9ec1b0d528a845fa5ea06bdc3f9f3f5e61dcc (diff)
downloadphp-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.c21
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;