Skip to content

Commit bcb3f7b

Browse files
committed
ext/opcache/zend_file_cache: add local zend_string* variables
Eliminates lots of redundant casts and avoids reloading the variable from RAM into registers.
1 parent b2f5ba2 commit bcb3f7b

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

ext/opcache/zend_file_cache.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -253,15 +253,18 @@ static void *zend_file_cache_serialize_interned(zend_string *str,
253253
len = ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(ZSTR_LEN(str)));
254254
ret = (void*)(info->str_size | Z_UL(1));
255255
zend_shared_alloc_register_xlat_entry(str, ret);
256-
if (info->str_size + len > ZSTR_LEN((zend_string*)ZCG(mem))) {
256+
257+
zend_string *s = (zend_string*)ZCG(mem);
258+
if (info->str_size + len > ZSTR_LEN(s)) {
257259
size_t new_len = info->str_size + len;
258-
ZCG(mem) = (void*)zend_string_realloc(
259-
(zend_string*)ZCG(mem),
260+
s = zend_string_realloc(
261+
s,
260262
((_ZSTR_HEADER_SIZE + 1 + new_len + 4095) & ~0xfff) - (_ZSTR_HEADER_SIZE + 1),
261263
0);
264+
ZCG(mem) = (void*)s;
262265
}
263266

264-
zend_string *new_str = (zend_string *) (ZSTR_VAL((zend_string*)ZCG(mem)) + info->str_size);
267+
zend_string *new_str = (zend_string *) (ZSTR_VAL(s) + info->str_size);
265268
memcpy(new_str, str, len);
266269
GC_ADD_FLAGS(new_str, IS_STR_INTERNED);
267270
GC_DEL_FLAGS(new_str, IS_STR_PERMANENT|IS_STR_CLASS_NAME_MAP_PTR);
@@ -1063,8 +1066,10 @@ int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm)
10631066
}
10641067
zend_shared_alloc_destroy_xlat_table();
10651068

1069+
zend_string *const s = (zend_string*)ZCG(mem);
1070+
10661071
info.checksum = zend_adler32(ADLER32_INIT, buf, script->size);
1067-
info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size);
1072+
info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL(s), info.str_size);
10681073

10691074
#if __has_feature(memory_sanitizer)
10701075
/* The buffer may contain uninitialized regions. However, the uninitialized parts will not be
@@ -1078,12 +1083,12 @@ int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm)
10781083
const struct iovec vec[] = {
10791084
{ .iov_base = (void *)&info, .iov_len = sizeof(info) },
10801085
{ .iov_base = buf, .iov_len = script->size },
1081-
{ .iov_base = ZSTR_VAL((zend_string*)ZCG(mem)), .iov_len = info.str_size },
1086+
{ .iov_base = ZSTR_VAL(s), .iov_len = info.str_size },
10821087
};
10831088

10841089
if (writev(fd, vec, sizeof(vec) / sizeof(vec[0])) != (ssize_t)(sizeof(info) + script->size + info.str_size)) {
10851090
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename);
1086-
zend_string_release_ex((zend_string*)ZCG(mem), 0);
1091+
zend_string_release_ex(s, 0);
10871092
close(fd);
10881093
efree(mem);
10891094
zend_file_cache_unlink(filename);
@@ -1094,10 +1099,10 @@ int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm)
10941099
if (ZEND_LONG_MAX < (zend_long)(sizeof(info) + script->size + info.str_size) ||
10951100
write(fd, &info, sizeof(info)) != sizeof(info) ||
10961101
write(fd, buf, script->size) != script->size ||
1097-
write(fd, ((zend_string*)ZCG(mem))->val, info.str_size) != info.str_size
1102+
write(fd, s->val, info.str_size) != info.str_size
10981103
) {
10991104
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename);
1100-
zend_string_release_ex((zend_string*)ZCG(mem), 0);
1105+
zend_string_release_ex(s, 0);
11011106
close(fd);
11021107
efree(mem);
11031108
zend_file_cache_unlink(filename);
@@ -1106,7 +1111,7 @@ int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm)
11061111
}
11071112
#endif
11081113

1109-
zend_string_release_ex((zend_string*)ZCG(mem), 0);
1114+
zend_string_release_ex(s, 0);
11101115
efree(mem);
11111116
if (zend_file_cache_flock(fd, LOCK_UN) != 0) {
11121117
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s'\n", filename);

0 commit comments

Comments
 (0)