35#ifndef HAVE_UNION_SEMUN
39 unsigned short int *array;
40 struct seminfo *__buf;
59#ifdef COMPILE_DL_SYSVSEM
79#define SYSVSEM_USAGE 1
80#define SYSVSEM_SETVAL 2
87static inline sysvsem_sem *sysvsem_from_obj(
zend_object *obj) {
88 return (sysvsem_sem *)((
char *)(obj) -
XtOffsetOf(sysvsem_sem, std));
91#define Z_SYSVSEM_P(zv) sysvsem_from_obj(Z_OBJ_P(zv))
94 sysvsem_sem *intern = zend_object_alloc(
sizeof(sysvsem_sem), class_type);
109 sysvsem_sem *sem_ptr = sysvsem_from_obj(
object);
110 struct sembuf sop[2];
117 if (sem_ptr->count == -1 || !sem_ptr->auto_release) {
123 sop[0].sem_num = SYSVSEM_USAGE;
125 sop[0].sem_flg = SEM_UNDO;
129 if (sem_ptr->count) {
131 sop[1].sem_num = SYSVSEM_SEM;
132 sop[1].sem_op = sem_ptr->count;
133 sop[1].sem_flg = SEM_UNDO;
138 semop(sem_ptr->semid, sop, opcount);
147 sysvsem_ce = register_class_SysvSemaphore();
148 sysvsem_ce->create_object = sysvsem_create_object;
149 sysvsem_ce->default_object_handlers = &sysvsem_object_handlers;
153 sysvsem_object_handlers.
free_obj = sysvsem_free_obj;
175 bool auto_release = 1;
177 struct sembuf sop[3];
179 sysvsem_sem *sem_ptr;
191 semid = semget(
key, 3, perm|IPC_CREAT);
208 sop[0].sem_num = SYSVSEM_SETVAL;
214 sop[1].sem_num = SYSVSEM_SETVAL;
216 sop[1].sem_flg = SEM_UNDO;
220 sop[2].sem_num = SYSVSEM_USAGE;
222 sop[2].sem_flg = SEM_UNDO;
223 while (semop(semid, sop, 3) == -1) {
224 if (
errno != EINTR) {
231 count = semctl(semid, SYSVSEM_USAGE, GETVAL,
NULL);
240 semarg.val = max_acquire;
241 if (semctl(semid, SYSVSEM_SEM, SETVAL, semarg) == -1) {
248 sop[0].sem_num = SYSVSEM_SETVAL;
250 sop[0].sem_flg = SEM_UNDO;
251 while (semop(semid, sop, 1) == -1) {
252 if (
errno != EINTR) {
262 sem_ptr->semid = semid;
264 sem_ptr->auto_release = (int) auto_release;
273 sysvsem_sem *sem_ptr;
286 sem_ptr = Z_SYSVSEM_P(arg_id);
288 if (!acquire && sem_ptr->count == 0) {
293 sop.sem_num = SYSVSEM_SEM;
294 sop.sem_op = acquire ? -1 : 1;
295 sop.sem_flg = SEM_UNDO | (nowait ? IPC_NOWAIT : 0);
297 while (semop(sem_ptr->semid, &sop, 1) == -1) {
298 if (
errno != EINTR) {
306 sem_ptr->count -= acquire ? -1 : 1;
335 sysvsem_sem *sem_ptr;
343 sem_ptr = Z_SYSVSEM_P(arg_id);
346 if (semctl(sem_ptr->semid, 0, IPC_STAT, un) < 0) {
351 if (semctl(sem_ptr->semid, 0, IPC_RMID, un) < 0) {
count(Countable|array $value, int $mode=COUNT_NORMAL)
zend_ffi_ctype_name_buf buf
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
php_info_print_table_start()
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
#define PHP_MINIT_FUNCTION
#define PHP_MINFO_FUNCTION
unsigned char key[REFLECTION_KEY_LEN]
zend_object_compare_t compare
zend_object_free_obj_t free_obj
zend_object_get_constructor_t get_constructor
zend_object_clone_obj_t clone_obj
sem_release(SysvSemaphore $semaphore)
sem_get(int $key, int $max_acquire=1, int $permissions=0666, bool $auto_release=true)
sem_remove(SysvSemaphore $semaphore)
sem_acquire(SysvSemaphore $semaphore, bool $non_blocking=false)
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
#define INTERNAL_FUNCTION_PARAMETERS
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
#define ZEND_GET_MODULE(name)
union _zend_function zend_function
#define STANDARD_MODULE_HEADER
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES
ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
#define XtOffsetOf(s_type, field)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
struct _zend_object_handlers zend_object_handlers