1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef ZEND_SHARED_ALLOC_H
23 #define ZEND_SHARED_ALLOC_H
24
25 #include "zend.h"
26 #include "ZendAccelerator.h"
27
28 #if defined(__APPLE__) && defined(__MACH__)
29 # ifdef HAVE_SHM_MMAP_POSIX
30 # define USE_SHM_OPEN 1
31 # endif
32 # ifdef HAVE_SHM_MMAP_ANON
33 # define USE_MMAP 1
34 # endif
35 #elif defined(__linux__) || defined(_AIX)
36 # ifdef HAVE_SHM_IPC
37 # define USE_SHM 1
38 # endif
39 # ifdef HAVE_SHM_MMAP_ANON
40 # define USE_MMAP 1
41 # endif
42 #elif defined(__sparc) || defined(__sun)
43 # ifdef HAVE_SHM_MMAP_POSIX
44 # define USE_SHM_OPEN 1
45 # endif
46 # ifdef HAVE_SHM_IPC
47 # define USE_SHM 1
48 # endif
49 # if defined(__i386)
50 # ifdef HAVE_SHM_MMAP_ANON
51 # define USE_MMAP 1
52 # endif
53 # endif
54 #else
55 # ifdef HAVE_SHM_MMAP_POSIX
56 # define USE_SHM_OPEN 1
57 # endif
58 # ifdef HAVE_SHM_MMAP_ANON
59 # define USE_MMAP 1
60 # endif
61 # ifdef HAVE_SHM_IPC
62 # define USE_SHM 1
63 # endif
64 #endif
65
66 #define ALLOC_FAILURE 0
67 #define ALLOC_SUCCESS 1
68 #define FAILED_REATTACHED 2
69 #define SUCCESSFULLY_REATTACHED 4
70 #define ALLOC_FAIL_MAPPING 8
71 #define ALLOC_FALLBACK 9
72
73 typedef struct _zend_shared_segment {
74 size_t size;
75 size_t pos;
76 void *p;
77 } zend_shared_segment;
78
79 typedef int (*create_segments_t)(size_t requested_size, zend_shared_segment ***shared_segments, int *shared_segment_count, char **error_in);
80 typedef int (*detach_segment_t)(zend_shared_segment *shared_segment);
81
82 typedef struct {
83 create_segments_t create_segments;
84 detach_segment_t detach_segment;
85 size_t (*segment_type_size)(void);
86 } zend_shared_memory_handlers;
87
88 typedef struct _handler_entry {
89 const char *name;
90 zend_shared_memory_handlers *handler;
91 } zend_shared_memory_handler_entry;
92
93 typedef struct _zend_shared_memory_state {
94 int *positions;
95 size_t shared_free;
96 } zend_shared_memory_state;
97
98 typedef struct _zend_smm_shared_globals {
99
100 zend_shared_segment **shared_segments;
101
102 int shared_segments_count;
103
104 size_t shared_free;
105
106 size_t wasted_shared_memory;
107
108 zend_bool memory_exhausted;
109
110 zend_shared_memory_state shared_memory_state;
111
112 void *app_shared_globals;
113 } zend_smm_shared_globals;
114
115 extern zend_smm_shared_globals *smm_shared_globals;
116
117 #define ZSMMG(element) (smm_shared_globals->element)
118
119 #define SHARED_ALLOC_REATTACHED (SUCCESS+1)
120
121 int zend_shared_alloc_startup(size_t requested_size);
122 void zend_shared_alloc_shutdown(void);
123
124
125 void *zend_shared_alloc(size_t size);
126
127
128 void *_zend_shared_memdup(void *p, size_t size, zend_bool free_source);
129 int zend_shared_memdup_size(void *p, size_t size);
130
131 int zend_accel_in_shm(void *ptr);
132
133 typedef union _align_test {
134 void *ptr;
135 double dbl;
136 zend_long lng;
137 } align_test;
138
139 #if ZEND_GCC_VERSION >= 2000
140 # define PLATFORM_ALIGNMENT (__alignof__(align_test) < 8 ? 8 : __alignof__(align_test))
141 #else
142 # define PLATFORM_ALIGNMENT (sizeof(align_test))
143 #endif
144
145 #define ZEND_ALIGNED_SIZE(size) \
146 ZEND_MM_ALIGNED_SIZE_EX(size, PLATFORM_ALIGNMENT)
147
148
149 void zend_shared_alloc_lock(void);
150 void zend_shared_alloc_unlock(void);
151 void zend_shared_alloc_safe_unlock(void);
152
153
154 void zend_shared_alloc_init_xlat_table(void);
155 void zend_shared_alloc_destroy_xlat_table(void);
156 void zend_shared_alloc_clear_xlat_table(void);
157 void zend_shared_alloc_register_xlat_entry(const void *old, const void *new);
158 void *zend_shared_alloc_get_xlat_entry(const void *old);
159
160 size_t zend_shared_alloc_get_free_memory(void);
161 void zend_shared_alloc_save_state(void);
162 void zend_shared_alloc_restore_state(void);
163 const char *zend_accel_get_shared_model(void);
164
165
166 void zend_accel_shared_protect(int mode);
167
168 #ifdef USE_MMAP
169 extern zend_shared_memory_handlers zend_alloc_mmap_handlers;
170 #endif
171
172 #ifdef USE_SHM
173 extern zend_shared_memory_handlers zend_alloc_shm_handlers;
174 #endif
175
176 #ifdef USE_SHM_OPEN
177 extern zend_shared_memory_handlers zend_alloc_posix_handlers;
178 #endif
179
180 #ifdef ZEND_WIN32
181 extern zend_shared_memory_handlers zend_alloc_win32_handlers;
182 void zend_shared_alloc_create_lock(void);
183 void zend_shared_alloc_lock_win32(void);
184 void zend_shared_alloc_unlock_win32(void);
185 #endif
186
187 #endif