35
35
#include "ext/standard/info.h"
36
36
#include "ext/standard/php_var.h"
37
37
#include "zend_smart_str.h"
38
+ #include "Zend/zend_interfaces.h"
38
39
#include "php_ini.h"
39
40
41
+ /* Sysvshm class */
42
+
43
+ zend_class_entry * sysvshm_ce ;
44
+ static zend_object_handlers sysvshm_object_handlers ;
45
+
46
+ static inline sysvshm_shm * sysvshm_from_obj (zend_object * obj ) {
47
+ return (sysvshm_shm * )((char * )(obj ) - XtOffsetOf (sysvshm_shm , std ));
48
+ }
49
+
50
+ #define Z_SYSVSHM_P (zv ) sysvshm_from_obj(Z_OBJ_P(zv))
51
+
52
+ static zend_object * sysvshm_create_object (zend_class_entry * class_type ) {
53
+ sysvshm_shm * intern = zend_object_alloc (sizeof (sysvshm_shm ), class_type );
54
+
55
+ zend_object_std_init (& intern -> std , class_type );
56
+ object_properties_init (& intern -> std , class_type );
57
+ intern -> std .handlers = & sysvshm_object_handlers ;
58
+
59
+ return & intern -> std ;
60
+ }
61
+
62
+ static zend_function * sysvshm_get_constructor (zend_object * object ) {
63
+ zend_throw_error (NULL , "Cannot directly construct Sysvshm, use shm_attach() instead" );
64
+ return NULL ;
65
+ }
66
+
67
+ static void sysvshm_free_obj (zend_object * object )
68
+ {
69
+ sysvshm_shm * sysvshm = sysvshm_from_obj (object );
70
+
71
+ shmdt ((void * ) sysvshm -> ptr );
72
+
73
+ zend_object_std_dtor (& sysvshm -> std );
74
+ }
75
+
40
76
/* {{{ sysvshm_module_entry
41
77
*/
42
78
zend_module_entry sysvshm_module_entry = {
@@ -59,33 +95,29 @@ ZEND_GET_MODULE(sysvshm)
59
95
60
96
#undef shm_ptr /* undefine AIX-specific macro */
61
97
62
- #define SHM_FETCH_RESOURCE (shm_ptr , z_ptr ) do { \
63
- if ((shm_ptr = (sysvshm_shm *)zend_fetch_resource(Z_RES_P(z_ptr), PHP_SHM_RSRC_NAME, php_sysvshm.le_shm)) == NULL) { \
64
- RETURN_THROWS(); \
65
- } \
66
- } while (0)
67
-
68
98
THREAD_LS sysvshm_module php_sysvshm ;
69
99
70
100
static int php_put_shm_data (sysvshm_chunk_head * ptr , zend_long key , const char * data , zend_long len );
71
101
static zend_long php_check_shm_data (sysvshm_chunk_head * ptr , zend_long key );
72
102
static int php_remove_shm_data (sysvshm_chunk_head * ptr , zend_long shm_varpos );
73
103
74
- /* {{{ php_release_sysvshm
75
- */
76
- static void php_release_sysvshm (zend_resource * rsrc )
77
- {
78
- sysvshm_shm * shm_ptr = (sysvshm_shm * ) rsrc -> ptr ;
79
- shmdt ((void * ) shm_ptr -> ptr );
80
- efree (shm_ptr );
81
- }
82
- /* }}} */
83
-
84
104
/* {{{ PHP_MINIT_FUNCTION
85
105
*/
86
106
PHP_MINIT_FUNCTION (sysvshm )
87
107
{
88
- php_sysvshm .le_shm = zend_register_list_destructors_ex (php_release_sysvshm , NULL , PHP_SHM_RSRC_NAME , module_number );
108
+ zend_class_entry ce ;
109
+ INIT_CLASS_ENTRY (ce , "Sysvshm" , class_Sysvshm_methods );
110
+ sysvshm_ce = zend_register_internal_class (& ce );
111
+ sysvshm_ce -> ce_flags |= ZEND_ACC_FINAL ;
112
+ sysvshm_ce -> create_object = sysvshm_create_object ;
113
+ sysvshm_ce -> serialize = zend_class_serialize_deny ;
114
+ sysvshm_ce -> unserialize = zend_class_unserialize_deny ;
115
+
116
+ memcpy (& sysvshm_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
117
+ sysvshm_object_handlers .offset = XtOffsetOf (sysvshm_shm , std );
118
+ sysvshm_object_handlers .free_obj = sysvshm_free_obj ;
119
+ sysvshm_object_handlers .get_constructor = sysvshm_get_constructor ;
120
+ sysvshm_object_handlers .clone_obj = NULL ;
89
121
90
122
if (cfg_get_long ("sysvshm.init_mem" , & php_sysvshm .init_mem ) == FAILURE ) {
91
123
php_sysvshm .init_mem = 10000 ;
@@ -122,25 +154,25 @@ PHP_FUNCTION(shm_attach)
122
154
RETURN_FALSE ;
123
155
}
124
156
125
- shm_list_ptr = ( sysvshm_shm * ) emalloc ( sizeof ( sysvshm_shm ) );
157
+ object_init_ex ( return_value , sysvshm_ce );
126
158
127
159
/* get the id from a specified key or create new shared memory */
128
160
if ((shm_id = shmget (shm_key , 0 , 0 )) < 0 ) {
129
161
if (shm_size < (zend_long )sizeof (sysvshm_chunk_head )) {
130
162
php_error_docref (NULL , E_WARNING , "Failed for key 0x" ZEND_XLONG_FMT ": memorysize too small" , shm_key );
131
- efree ( shm_list_ptr );
163
+ zval_ptr_dtor ( return_value );
132
164
RETURN_FALSE ;
133
165
}
134
166
if ((shm_id = shmget (shm_key , shm_size , shm_flag | IPC_CREAT | IPC_EXCL )) < 0 ) {
135
167
php_error_docref (NULL , E_WARNING , "Failed for key 0x" ZEND_XLONG_FMT ": %s" , shm_key , strerror (errno ));
136
- efree ( shm_list_ptr );
168
+ zval_ptr_dtor ( return_value );
137
169
RETURN_FALSE ;
138
170
}
139
171
}
140
172
141
173
if ((shm_ptr = shmat (shm_id , NULL , 0 )) == (void * ) -1 ) {
142
174
php_error_docref (NULL , E_WARNING , "Failed for key 0x" ZEND_XLONG_FMT ": %s" , shm_key , strerror (errno ));
143
- efree ( shm_list_ptr );
175
+ zval_ptr_dtor ( return_value );
144
176
RETURN_FALSE ;
145
177
}
146
178
@@ -154,40 +186,40 @@ PHP_FUNCTION(shm_attach)
154
186
chunk_ptr -> free = shm_size - chunk_ptr -> end ;
155
187
}
156
188
189
+ shm_list_ptr = Z_SYSVSHM_P (return_value );
190
+
157
191
shm_list_ptr -> key = shm_key ;
158
192
shm_list_ptr -> id = shm_id ;
159
193
shm_list_ptr -> ptr = chunk_ptr ;
160
-
161
- RETURN_RES (zend_register_resource (shm_list_ptr , php_sysvshm .le_shm ));
162
194
}
163
195
/* }}} */
164
196
165
- /* {{{ proto bool shm_detach(resource shm_identifier)
197
+ /* {{{ proto bool shm_detach(Sysvshm shm_identifier)
166
198
Disconnects from shared memory segment */
167
199
PHP_FUNCTION (shm_detach )
168
200
{
169
201
zval * shm_id ;
170
- sysvshm_shm * shm_list_ptr ;
171
202
172
- if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "r " , & shm_id )) {
203
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "O " , & shm_id , sysvshm_ce )) {
173
204
RETURN_THROWS ();
174
205
}
175
- SHM_FETCH_RESOURCE ( shm_list_ptr , shm_id );
176
- RETURN_BOOL ( SUCCESS == zend_list_close ( Z_RES_P ( shm_id ))) ;
206
+
207
+ RETURN_TRUE ;
177
208
}
178
209
/* }}} */
179
210
180
- /* {{{ proto bool shm_remove(resource shm_identifier)
211
+ /* {{{ proto bool shm_remove(Sysvshm shm_identifier)
181
212
Removes shared memory from Unix systems */
182
213
PHP_FUNCTION (shm_remove )
183
214
{
184
215
zval * shm_id ;
185
216
sysvshm_shm * shm_list_ptr ;
186
217
187
- if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "r " , & shm_id )) {
218
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "O " , & shm_id , sysvshm_ce )) {
188
219
RETURN_THROWS ();
189
220
}
190
- SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
221
+
222
+ shm_list_ptr = Z_SYSVSHM_P (shm_id );
191
223
192
224
if (shmctl (shm_list_ptr -> id , IPC_RMID , NULL ) < 0 ) {
193
225
php_error_docref (NULL , E_WARNING , "Failed for key 0x%x, id " ZEND_LONG_FMT ": %s" , shm_list_ptr -> key , Z_LVAL_P (shm_id ), strerror (errno ));
@@ -198,7 +230,7 @@ PHP_FUNCTION(shm_remove)
198
230
}
199
231
/* }}} */
200
232
201
- /* {{{ proto bool shm_put_var(resource shm_identifier, int variable_key, mixed variable)
233
+ /* {{{ proto bool shm_put_var(Sysvshm shm_identifier, int variable_key, mixed variable)
202
234
Inserts or updates a variable in shared memory */
203
235
PHP_FUNCTION (shm_put_var )
204
236
{
@@ -209,7 +241,7 @@ PHP_FUNCTION(shm_put_var)
209
241
smart_str shm_var = {0 };
210
242
php_serialize_data_t var_hash ;
211
243
212
- if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "rlz " , & shm_id , & shm_key , & arg_var )) {
244
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "Olz " , & shm_id , sysvshm_ce , & shm_key , & arg_var )) {
213
245
RETURN_THROWS ();
214
246
}
215
247
@@ -218,11 +250,7 @@ PHP_FUNCTION(shm_put_var)
218
250
php_var_serialize (& shm_var , arg_var , & var_hash );
219
251
PHP_VAR_SERIALIZE_DESTROY (var_hash );
220
252
221
- shm_list_ptr = zend_fetch_resource (Z_RES_P (shm_id ), PHP_SHM_RSRC_NAME , php_sysvshm .le_shm );
222
- if (!shm_list_ptr ) {
223
- smart_str_free (& shm_var );
224
- RETURN_THROWS ();
225
- }
253
+ shm_list_ptr = Z_SYSVSHM_P (shm_id );
226
254
227
255
/* insert serialized variable into shared memory */
228
256
ret = php_put_shm_data (shm_list_ptr -> ptr , shm_key , shm_var .s ? ZSTR_VAL (shm_var .s ) : NULL , shm_var .s ? ZSTR_LEN (shm_var .s ) : 0 );
@@ -238,7 +266,7 @@ PHP_FUNCTION(shm_put_var)
238
266
}
239
267
/* }}} */
240
268
241
- /* {{{ proto mixed shm_get_var(resource id, int variable_key)
269
+ /* {{{ proto mixed shm_get_var(Sysvshm id, int variable_key)
242
270
Returns a variable from shared memory */
243
271
PHP_FUNCTION (shm_get_var )
244
272
{
@@ -250,10 +278,11 @@ PHP_FUNCTION(shm_get_var)
250
278
sysvshm_chunk * shm_var ;
251
279
php_unserialize_data_t var_hash ;
252
280
253
- if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "rl " , & shm_id , & shm_key )) {
281
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "Ol " , & shm_id , sysvshm_ce , & shm_key )) {
254
282
RETURN_THROWS ();
255
283
}
256
- SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
284
+
285
+ shm_list_ptr = Z_SYSVSHM_P (shm_id );
257
286
258
287
/* setup string-variable and serialize */
259
288
/* get serialized variable from shared memory */
@@ -275,34 +304,37 @@ PHP_FUNCTION(shm_get_var)
275
304
}
276
305
/* }}} */
277
306
278
- /* {{{ proto bool shm_has_var(resource id, int variable_key)
307
+ /* {{{ proto bool shm_has_var(Sysvshm id, int variable_key)
279
308
Checks whether a specific entry exists */
280
309
PHP_FUNCTION (shm_has_var )
281
310
{
282
311
zval * shm_id ;
283
312
zend_long shm_key ;
284
313
sysvshm_shm * shm_list_ptr ;
285
314
286
- if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "rl " , & shm_id , & shm_key )) {
315
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "Ol " , & shm_id , sysvshm_ce , & shm_key )) {
287
316
RETURN_THROWS ();
288
317
}
289
- SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
318
+
319
+ shm_list_ptr = Z_SYSVSHM_P (shm_id );
320
+
290
321
RETURN_BOOL (php_check_shm_data (shm_list_ptr -> ptr , shm_key ) >= 0 );
291
322
}
292
323
/* }}} */
293
324
294
- /* {{{ proto bool shm_remove_var(resource id, int variable_key)
325
+ /* {{{ proto bool shm_remove_var(Sysvshm id, int variable_key)
295
326
Removes variable from shared memory */
296
327
PHP_FUNCTION (shm_remove_var )
297
328
{
298
329
zval * shm_id ;
299
330
zend_long shm_key , shm_varpos ;
300
331
sysvshm_shm * shm_list_ptr ;
301
332
302
- if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "rl " , & shm_id , & shm_key )) {
333
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "Ol " , & shm_id , sysvshm_ce , & shm_key )) {
303
334
RETURN_THROWS ();
304
335
}
305
- SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
336
+
337
+ shm_list_ptr = Z_SYSVSHM_P (shm_id );
306
338
307
339
shm_varpos = php_check_shm_data ((shm_list_ptr -> ptr ), shm_key );
308
340
0 commit comments