39
39
#include "sysvsem_arginfo.h"
40
40
#include "php_sysvsem.h"
41
41
#include "ext/standard/info.h"
42
+ #include "Zend/zend_interfaces.h"
42
43
43
44
#if !HAVE_SEMUN
44
45
@@ -74,9 +75,6 @@ zend_module_entry sysvsem_module_entry = {
74
75
ZEND_GET_MODULE (sysvsem )
75
76
#endif
76
77
77
-
78
- THREAD_LS sysvsem_module php_sysvsem_module ;
79
-
80
78
/* Semaphore functions using System V semaphores. Each semaphore
81
79
* actually consists of three semaphores allocated as a unit under the
82
80
* same key. Semaphore 0 (SYSVSEM_SEM) is the actual semaphore, it is
@@ -96,11 +94,35 @@ THREAD_LS sysvsem_module php_sysvsem_module;
96
94
#define SYSVSEM_USAGE 1
97
95
#define SYSVSEM_SETVAL 2
98
96
99
- /* {{{ release_sysvsem_sem
100
- */
101
- static void release_sysvsem_sem (zend_resource * rsrc )
97
+ /* Sysvsem class */
98
+
99
+ zend_class_entry * sysvsem_ce ;
100
+ static zend_object_handlers sysvsem_object_handlers ;
101
+
102
+ static inline sysvsem_sem * sysvsem_from_obj (zend_object * obj ) {
103
+ return (sysvsem_sem * )((char * )(obj ) - XtOffsetOf (sysvsem_sem , std ));
104
+ }
105
+
106
+ #define Z_SYSVSEM_P (zv ) sysvsem_from_obj(Z_OBJ_P(zv))
107
+
108
+ static zend_object * sysvsem_create_object (zend_class_entry * class_type ) {
109
+ sysvsem_sem * intern = zend_object_alloc (sizeof (sysvsem_sem ), class_type );
110
+
111
+ zend_object_std_init (& intern -> std , class_type );
112
+ object_properties_init (& intern -> std , class_type );
113
+ intern -> std .handlers = & sysvsem_object_handlers ;
114
+
115
+ return & intern -> std ;
116
+ }
117
+
118
+ static zend_function * sysvsem_get_constructor (zend_object * object ) {
119
+ zend_throw_error (NULL , "Cannot directly construct Sysvsem, use sem_get() instead" );
120
+ return NULL ;
121
+ }
122
+
123
+ static void sysvsem_free_obj (zend_object * object )
102
124
{
103
- sysvsem_sem * sem_ptr = ( sysvsem_sem * ) rsrc -> ptr ;
125
+ sysvsem_sem * sem_ptr = sysvsem_from_obj ( object ) ;
104
126
struct sembuf sop [2 ];
105
127
int opcount = 1 ;
106
128
/*
@@ -130,15 +152,29 @@ static void release_sysvsem_sem(zend_resource *rsrc)
130
152
}
131
153
132
154
semop (sem_ptr -> semid , sop , opcount );
133
- efree (sem_ptr );
155
+
156
+ zend_object_std_dtor (& sem_ptr -> std );
134
157
}
135
158
/* }}} */
136
159
137
160
/* {{{ PHP_MINIT_FUNCTION
138
161
*/
139
162
PHP_MINIT_FUNCTION (sysvsem )
140
163
{
141
- php_sysvsem_module .le_sem = zend_register_list_destructors_ex (release_sysvsem_sem , NULL , "sysvsem" , module_number );
164
+ zend_class_entry ce ;
165
+ INIT_CLASS_ENTRY (ce , "Sysvsem" , class_Sysvsem_methods );
166
+ sysvsem_ce = zend_register_internal_class (& ce );
167
+ sysvsem_ce -> ce_flags |= ZEND_ACC_FINAL ;
168
+ sysvsem_ce -> create_object = sysvsem_create_object ;
169
+ sysvsem_ce -> serialize = zend_class_serialize_deny ;
170
+ sysvsem_ce -> unserialize = zend_class_unserialize_deny ;
171
+
172
+ memcpy (& sysvsem_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
173
+ sysvsem_object_handlers .offset = XtOffsetOf (sysvsem_sem , std );
174
+ sysvsem_object_handlers .free_obj = sysvsem_free_obj ;
175
+ sysvsem_object_handlers .get_constructor = sysvsem_get_constructor ;
176
+ sysvsem_object_handlers .clone_obj = NULL ;
177
+
142
178
return SUCCESS ;
143
179
}
144
180
/* }}} */
@@ -159,7 +195,7 @@ PHP_MINFO_FUNCTION(sysvsem)
159
195
#undef SETVAL_WANTS_PTR
160
196
#endif
161
197
162
- /* {{{ proto resource sem_get(int key [, int max_acquire [, int perm [, int auto_release]])
198
+ /* {{{ proto Sysvsem sem_get(int key [, int max_acquire [, int perm [, int auto_release]])
163
199
Return an id for the semaphore with the given key, and allow max_acquire (default 1) processes to acquire it simultaneously */
164
200
PHP_FUNCTION (sem_get )
165
201
{
@@ -259,14 +295,13 @@ PHP_FUNCTION(sem_get)
259
295
}
260
296
}
261
297
262
- sem_ptr = (sysvsem_sem * ) emalloc (sizeof (sysvsem_sem ));
298
+ object_init_ex (return_value , sysvsem_ce );
299
+
300
+ sem_ptr = Z_SYSVSEM_P (return_value );
263
301
sem_ptr -> key = key ;
264
302
sem_ptr -> semid = semid ;
265
303
sem_ptr -> count = 0 ;
266
304
sem_ptr -> auto_release = auto_release ;
267
-
268
- RETVAL_RES (zend_register_resource (sem_ptr , php_sysvsem_module .le_sem ));
269
- sem_ptr -> id = Z_RES_HANDLE_P (return_value );
270
305
}
271
306
/* }}} */
272
307
@@ -280,21 +315,19 @@ static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)
280
315
struct sembuf sop ;
281
316
282
317
if (acquire ) {
283
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "r |b" , & arg_id , & nowait ) == FAILURE ) {
318
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "O |b" , & arg_id , sysvsem_ce , & nowait ) == FAILURE ) {
284
319
RETURN_THROWS ();
285
320
}
286
321
} else {
287
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "r " , & arg_id ) == FAILURE ) {
322
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "O " , & arg_id , sysvsem_ce ) == FAILURE ) {
288
323
RETURN_THROWS ();
289
324
}
290
325
}
291
326
292
- if ((sem_ptr = (sysvsem_sem * )zend_fetch_resource (Z_RES_P (arg_id ), "SysV semaphore" , php_sysvsem_module .le_sem )) == NULL ) {
293
- RETURN_THROWS ();
294
- }
327
+ sem_ptr = Z_SYSVSEM_P (arg_id );
295
328
296
329
if (!acquire && sem_ptr -> count == 0 ) {
297
- php_error_docref (NULL , E_WARNING , "SysV semaphore " ZEND_LONG_FMT " ( key 0x%x) is not currently acquired", Z_LVAL_P ( arg_id ) , sem_ptr -> key );
330
+ php_error_docref (NULL , E_WARNING , "SysV semaphore for key 0x%x is not currently acquired" , sem_ptr -> key );
298
331
RETURN_FALSE ;
299
332
}
300
333
@@ -316,23 +349,23 @@ static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)
316
349
}
317
350
/* }}} */
318
351
319
- /* {{{ proto bool sem_acquire(resource id)
352
+ /* {{{ proto bool sem_acquire(Sysvsem id)
320
353
Acquires the semaphore with the given id, blocking if necessary */
321
354
PHP_FUNCTION (sem_acquire )
322
355
{
323
356
php_sysvsem_semop (INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 );
324
357
}
325
358
/* }}} */
326
359
327
- /* {{{ proto bool sem_release(resource id)
360
+ /* {{{ proto bool sem_release(Sysvsem id)
328
361
Releases the semaphore with the given id */
329
362
PHP_FUNCTION (sem_release )
330
363
{
331
364
php_sysvsem_semop (INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 );
332
365
}
333
366
/* }}} */
334
367
335
- /* {{{ proto bool sem_remove(resource id)
368
+ /* {{{ proto bool sem_remove(Sysvsem id)
336
369
Removes semaphore from Unix systems */
337
370
338
371
/*
@@ -349,21 +382,19 @@ PHP_FUNCTION(sem_remove)
349
382
struct semid_ds buf ;
350
383
#endif
351
384
352
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "r " , & arg_id ) == FAILURE ) {
385
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "O " , & arg_id , sysvsem_ce ) == FAILURE ) {
353
386
RETURN_THROWS ();
354
387
}
355
388
356
- if ((sem_ptr = (sysvsem_sem * )zend_fetch_resource (Z_RES_P (arg_id ), "SysV semaphore" , php_sysvsem_module .le_sem )) == NULL ) {
357
- RETURN_THROWS ();
358
- }
389
+ sem_ptr = Z_SYSVSEM_P (arg_id );
359
390
360
391
#if HAVE_SEMUN
361
392
un .buf = & buf ;
362
393
if (semctl (sem_ptr -> semid , 0 , IPC_STAT , un ) < 0 ) {
363
394
#else
364
395
if (semctl (sem_ptr -> semid , 0 , IPC_STAT , NULL ) < 0 ) {
365
396
#endif
366
- php_error_docref (NULL , E_WARNING , "SysV semaphore " ZEND_LONG_FMT " does not (any longer) exist" , Z_LVAL_P ( arg_id ) );
397
+ php_error_docref (NULL , E_WARNING , "SysV semaphore for key 0x%x does not (any longer) exist" , sem_ptr -> key );
367
398
RETURN_FALSE ;
368
399
}
369
400
@@ -372,7 +403,7 @@ PHP_FUNCTION(sem_remove)
372
403
#else
373
404
if (semctl (sem_ptr -> semid , 0 , IPC_RMID , NULL ) < 0 ) {
374
405
#endif
375
- php_error_docref (NULL , E_WARNING , "Failed for SysV semaphore " ZEND_LONG_FMT " : %s" , Z_LVAL_P ( arg_id ) , strerror (errno ));
406
+ php_error_docref (NULL , E_WARNING , "Failed for SysV semaphore for key 0x%x : %s" , sem_ptr -> key , strerror (errno ));
376
407
RETURN_FALSE ;
377
408
}
378
409
0 commit comments