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
72 typedef struct _zend_shared_segment {
73 size_t size;
74 size_t pos;
75 void *p;
76 } zend_shared_segment;
77
78 typedef int (*create_segments_t)(size_t requested_size, zend_shared_segment ***shared_segments, int *shared_segment_count, char **error_in);
79 typedef int (*detach_segment_t)(zend_shared_segment *shared_segment);
80
81 typedef struct {
82 create_segments_t create_segments;
83 detach_segment_t detach_segment;
84 size_t (*segment_type_size)(void);
85 } zend_shared_memory_handlers;
86
87 typedef struct _handler_entry {
88 const char *name;
89 zend_shared_memory_handlers *handler;
90 } zend_shared_memory_handler_entry;
91
92 typedef struct _zend_shared_memory_state {
93 int *positions;
94 size_t shared_free;
95 } zend_shared_memory_state;
96
97 typedef struct _zend_smm_shared_globals {
98
99 zend_shared_segment **shared_segments;
100
101 int shared_segments_count;
102
103 size_t shared_free;
104
105 int wasted_shared_memory;
106
107 zend_bool memory_exhausted;
108
109 zend_shared_memory_state shared_memory_state;
110
111 void *app_shared_globals;
112 } zend_smm_shared_globals;
113
114 extern zend_smm_shared_globals *smm_shared_globals;
115
116 #define ZSMMG(element) (smm_shared_globals->element)
117
118 #define SHARED_ALLOC_REATTACHED (SUCCESS+1)
119
120 int zend_shared_alloc_startup(size_t requested_size);
121 void zend_shared_alloc_shutdown(void);
122
123
124 void *zend_shared_alloc(size_t size);
125
126
127 void *_zend_shared_memdup(void *p, size_t size, zend_bool free_source TSRMLS_DC);
128 int zend_shared_memdup_size(void *p, size_t size);
129
130 typedef union _align_test {
131 void *ptr;
132 double dbl;
133 long lng;
134 } align_test;
135
136 #if ZEND_GCC_VERSION >= 2000
137 # define PLATFORM_ALIGNMENT (__alignof__ (align_test))
138 #else
139 # define PLATFORM_ALIGNMENT (sizeof(align_test))
140 #endif
141
142 #define ZEND_ALIGNED_SIZE(size) \
143 ((size + PLATFORM_ALIGNMENT - 1) & ~(PLATFORM_ALIGNMENT - 1))
144
145
146 void zend_shared_alloc_lock(TSRMLS_D);
147 void zend_shared_alloc_unlock(TSRMLS_D);
148 void zend_shared_alloc_safe_unlock(TSRMLS_D);
149
150
151 void zend_shared_alloc_clear_xlat_table(void);
152 void zend_shared_alloc_register_xlat_entry(const void *old, const void *new);
153 void *zend_shared_alloc_get_xlat_entry(const void *old);
154
155 size_t zend_shared_alloc_get_free_memory(void);
156 void zend_shared_alloc_save_state(void);
157 void zend_shared_alloc_restore_state(void);
158 const char *zend_accel_get_shared_model(void);
159
160
161 void zend_accel_shared_protect(int mode TSRMLS_DC);
162
163 #ifdef USE_MMAP
164 extern zend_shared_memory_handlers zend_alloc_mmap_handlers;
165 #endif
166
167 #ifdef USE_SHM
168 extern zend_shared_memory_handlers zend_alloc_shm_handlers;
169 #endif
170
171 #ifdef USE_SHM_OPEN
172 extern zend_shared_memory_handlers zend_alloc_posix_handlers;
173 #endif
174
175 #ifdef ZEND_WIN32
176 extern zend_shared_memory_handlers zend_alloc_win32_handlers;
177 void zend_shared_alloc_create_lock(void);
178 void zend_shared_alloc_lock_win32(void);
179 void zend_shared_alloc_unlock_win32(void);
180 #endif
181
182 #endif