*/
if(sem_ptr->count == -1 || !sem_ptr->auto_release) {
+ efree(sem_ptr);
return;
}
/* Decrement the usage count. */
sem_ptr->count = 0;
sem_ptr->auto_release = auto_release;
- Z_LVAL_P(return_value) = zend_list_insert(sem_ptr, php_sysvsem_module.le_sem);
- Z_TYPE_P(return_value) = IS_LONG;
-
- sem_ptr->id = (int)Z_LVAL_P(return_value);
+ sem_ptr->id = ZEND_REGISTER_RESOURCE(return_value, sem_ptr, php_sysvsem_module.le_sem);
}
/* }}} */
static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)
{
pval **arg_id;
- int id, type;
sysvsem_sem *sem_ptr;
struct sembuf sop;
if (zend_get_parameters_ex(1, &arg_id)==FAILURE) {
RETURN_FALSE;
}
- convert_to_long_ex(arg_id);
- id = (int)Z_LVAL_PP(arg_id);
break;
default:
WRONG_PARAM_COUNT;
break;
}
- sem_ptr = (sysvsem_sem *) zend_list_find(id, &type);
- if (type!=php_sysvsem_module.le_sem) {
- php_error(E_WARNING, "%d is not a SysV semaphore index", id);
- RETURN_FALSE;
- }
+ ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, arg_id, -1, "SysV semphore", php_sysvsem_module.le_sem);
if (!acquire && sem_ptr->count == 0) {
- php_error(E_WARNING, "SysV semaphore index %d (key 0x%x) is not currently acquired", id, sem_ptr->key);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "SysV semaphore %d (key 0x%x) is not currently acquired", Z_LVAL_PP(arg_id), sem_ptr->key);
RETURN_FALSE;
}
PHP_FUNCTION(sem_remove)
{
pval **arg_id;
- int id,type;
sysvsem_sem *sem_ptr;
#if HAVE_SEMUN
union semun un;
if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg_id) == FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_long_ex(arg_id);
-
- id = Z_LVAL_PP(arg_id);
- sem_ptr = (sysvsem_sem *) zend_list_find(id, &type);
-
- if (type!=php_sysvsem_module.le_sem) {
- php_error(E_WARNING, "%d is not a SysV semaphore index", id);
- RETURN_FALSE;
- }
+ ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, arg_id, -1, "SysV semphore", php_sysvsem_module.le_sem);
#if HAVE_SEMUN
un.buf = &buf;
- if(semctl(sem_ptr->semid, 0, IPC_STAT, &un) < 0) {
+ if(semctl(sem_ptr->semid, 0, IPC_STAT, un) < 0) {
#else
if(semctl(sem_ptr->semid, 0, IPC_STAT, NULL) < 0) {
#endif
- php_error(E_WARNING, "%d is not a existing SysV Semaphore Id", id);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "SysV semphore %d does not (any longer) exist", Z_LVAL_PP(arg_id));
RETURN_FALSE;
}
#if HAVE_SEMUN
- if(semctl(sem_ptr->semid, 0, IPC_RMID, &un) < 0) {
+ if(semctl(sem_ptr->semid, 0, IPC_RMID, un) < 0) {
#else
if(semctl(sem_ptr->semid, 0, IPC_RMID, NULL) < 0) {
#endif
- php_error(E_WARNING, "sem_remove() failed for id %d: %s", id, strerror(errno));
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed for SysV sempphore %d: %s", Z_LVAL_PP(arg_id), strerror(errno));
RETURN_FALSE;
}