mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00

This solely affects the builtin enum functions currently. Given that these are stored in SHM, we cannot simply hardwire a pointer into the internal function runtime cache on NTS too, but have to use a MAP_PTR (like on ZTS). Now, by design, the runtime cache of internal functions no longer is reset between requests, hence we need to store them explicitly as static runtime cache. On NTS builds we cannot trivially move the pointers into CG(internal_run_time_cache) as they're directly stored on the individual functions (on ZTS we could simply iterate the static map_ptrs). Hence, we have the choice between having opcache managing the internal run_time_cache for its preloaded functions itself or realloc CG(internal_run_time_cache) and iterate through all functions to assign the new address. We choose the latter for simplicity and initial speed.
93 lines
3.5 KiB
C
93 lines
3.5 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| Zend Engine |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 2.00 of the Zend license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.zend.com/license/2_00.txt. |
|
|
| If you did not receive a copy of the Zend license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@zend.com so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
| Authors: Dmitry Stogov <dmitry@php.net> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#ifndef ZEND_MAP_PTR_H
|
|
#define ZEND_MAP_PTR_H
|
|
|
|
#include "zend_portability.h"
|
|
|
|
typedef struct _zend_string zend_string;
|
|
|
|
#define ZEND_MAP_PTR_KIND_PTR 0
|
|
#define ZEND_MAP_PTR_KIND_PTR_OR_OFFSET 1
|
|
|
|
#define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
|
|
|
|
#define ZEND_MAP_PTR(ptr) \
|
|
ptr ## __ptr
|
|
#define ZEND_MAP_PTR_DEF(type, name) \
|
|
type ZEND_MAP_PTR(name)
|
|
#define ZEND_MAP_PTR_OFFSET2PTR(offset) \
|
|
((void**)((char*)CG(map_ptr_base) + offset))
|
|
#define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
|
|
((void*)(((char*)(ptr)) - ((char*)CG(map_ptr_base))))
|
|
#define ZEND_MAP_PTR_INIT(ptr, val) do { \
|
|
ZEND_MAP_PTR(ptr) = (val); \
|
|
} while (0)
|
|
#define ZEND_MAP_PTR_NEW(ptr) do { \
|
|
ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
|
|
} while (0)
|
|
#define ZEND_MAP_PTR_NEW_STATIC(ptr) do { \
|
|
ZEND_MAP_PTR(ptr) = zend_map_ptr_new_static(); \
|
|
} while (0)
|
|
|
|
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
|
|
# define ZEND_MAP_PTR_NEW_OFFSET() \
|
|
((uint32_t)(uintptr_t)zend_map_ptr_new())
|
|
# define ZEND_MAP_PTR_IS_OFFSET(ptr) \
|
|
(((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L)
|
|
# define ZEND_MAP_PTR_GET(ptr) \
|
|
((ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
|
|
ZEND_MAP_PTR_GET_IMM(ptr) : \
|
|
((void*)(ZEND_MAP_PTR(ptr)))))
|
|
# define ZEND_MAP_PTR_GET_IMM(ptr) \
|
|
(*ZEND_MAP_PTR_OFFSET2PTR((intptr_t)ZEND_MAP_PTR(ptr)))
|
|
# define ZEND_MAP_PTR_SET(ptr, val) do { \
|
|
if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
|
|
ZEND_MAP_PTR_SET_IMM(ptr, val); \
|
|
} else { \
|
|
ZEND_MAP_PTR_INIT(ptr, val); \
|
|
} \
|
|
} while (0)
|
|
# define ZEND_MAP_PTR_SET_IMM(ptr, val) do { \
|
|
void **__p = ZEND_MAP_PTR_OFFSET2PTR((intptr_t)ZEND_MAP_PTR(ptr)); \
|
|
*__p = (val); \
|
|
} while (0)
|
|
# define ZEND_MAP_PTR_BIASED_BASE(real_base) \
|
|
((void*)(((uintptr_t)(real_base)) + zend_map_ptr_static_size * sizeof(void *) - 1))
|
|
/* Note: chunked like: [8192..12287][4096..8191][0..4095] */
|
|
#define ZEND_MAP_PTR_STATIC_NUM_TO_PTR(num) \
|
|
((void **)CG(map_ptr_real_base) + zend_map_ptr_static_size - ZEND_MM_ALIGNED_SIZE_EX((num) + 1, 4096) + ((num) & 4095))
|
|
#else
|
|
# error "Unknown ZEND_MAP_PTR_KIND"
|
|
#endif
|
|
|
|
BEGIN_EXTERN_C()
|
|
|
|
ZEND_API void zend_map_ptr_reset(void);
|
|
ZEND_API void *zend_map_ptr_new(void);
|
|
ZEND_API void *zend_map_ptr_new_static(void);
|
|
ZEND_API void zend_map_ptr_extend(size_t last);
|
|
ZEND_API void zend_alloc_ce_cache(zend_string *type_name);
|
|
|
|
ZEND_API extern size_t zend_map_ptr_static_last;
|
|
ZEND_API extern size_t zend_map_ptr_static_size;
|
|
|
|
END_EXTERN_C()
|
|
|
|
#endif /* ZEND_MAP_PTR_H */
|