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