Skip to content

Commit 795efd7

Browse files
authored
Add zend_getpagesize() and reuse it in accelerator and fiber (#7057)
1 parent 3c827b3 commit 795efd7

File tree

4 files changed

+27
-19
lines changed

4 files changed

+27
-19
lines changed

Zend/zend.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,21 @@ ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32
12051205
}
12061206
/* }}} */
12071207

1208+
ZEND_API size_t zend_get_page_size(void)
1209+
{
1210+
#ifdef _WIN32
1211+
SYSTEM_INFO system_info;
1212+
GetSystemInfo(&system_info);
1213+
return system_info.dwPageSize;
1214+
#elif defined(__FreeBSD__)
1215+
/* This returns the value obtained from
1216+
* the auxv vector, avoiding a syscall. */
1217+
return getpagesize();
1218+
#else
1219+
return (size_t) sysconf(_SC_PAGESIZE);
1220+
#endif
1221+
}
1222+
12081223
ZEND_API void zend_append_version_info(const zend_extension *extension) /* {{{ */
12091224
{
12101225
char *new_info;

Zend/zend.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ zend_result zend_post_startup(void);
265265
void zend_set_utility_values(zend_utility_values *utility_values);
266266

267267
ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno);
268+
ZEND_API size_t zend_get_page_size(void);
268269

269270
ZEND_API size_t zend_vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap);
270271
ZEND_API size_t zend_spprintf(char **message, size_t max_len, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 3, 4);

Zend/zend_fibers.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,27 +90,25 @@ extern transfer_t jump_fcontext(fcontext_t to, void *vp);
9090
# define ZEND_FIBER_STACK_FLAGS (MAP_PRIVATE | MAP_ANON)
9191
#endif
9292

93-
94-
95-
static size_t zend_fiber_page_size()
93+
static size_t zend_fiber_get_page_size(void)
9694
{
97-
#if _POSIX_MAPPED_FILES
98-
static size_t page_size;
95+
static size_t page_size = 0;
9996

10097
if (!page_size) {
101-
page_size = sysconf(_SC_PAGESIZE);
98+
page_size = zend_get_page_size();
99+
if (!page_size || (page_size & (page_size - 1))) {
100+
/* anyway, we have to return a valid result */
101+
page_size = ZEND_FIBER_DEFAULT_PAGE_SIZE;
102+
}
102103
}
103104

104105
return page_size;
105-
#else
106-
return ZEND_FIBER_DEFAULT_PAGE_SIZE;
107-
#endif
108106
}
109107

110108
static bool zend_fiber_stack_allocate(zend_fiber_stack *stack, size_t size)
111109
{
112110
void *pointer;
113-
const size_t page_size = zend_fiber_page_size();
111+
const size_t page_size = zend_fiber_get_page_size();
114112

115113
ZEND_ASSERT(size >= page_size + ZEND_FIBER_GUARD_PAGES * page_size);
116114

@@ -167,7 +165,7 @@ static void zend_fiber_stack_free(zend_fiber_stack *stack)
167165
VALGRIND_STACK_DEREGISTER(stack->valgrind);
168166
#endif
169167

170-
const size_t page_size = zend_fiber_page_size();
168+
const size_t page_size = zend_fiber_get_page_size();
171169

172170
void *pointer = (void *) ((uintptr_t) stack->pointer - ZEND_FIBER_GUARD_PAGES * page_size);
173171

ext/opcache/ZendAccelerator.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3171,14 +3171,8 @@ static zend_result accel_post_startup(void)
31713171
&& zend_jit_check_support() == SUCCESS) {
31723172
size_t page_size;
31733173

3174-
# ifdef _WIN32
3175-
SYSTEM_INFO system_info;
3176-
GetSystemInfo(&system_info);
3177-
page_size = system_info.dwPageSize;
3178-
# else
3179-
page_size = getpagesize();
3180-
# endif
3181-
if (!page_size || (page_size & (page_size - 1))) {
3174+
page_size = zend_get_page_size();
3175+
if (!page_size && (page_size & (page_size - 1))) {
31823176
zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can't get page size.");
31833177
abort();
31843178
}

0 commit comments

Comments
 (0)