mirror of
https://github.com/danog/ext-uv.git
synced 2024-11-26 20:14:47 +01:00
add uv_sem_init
This commit is contained in:
parent
89aba91e94
commit
b9d5715635
43
php_uv.c
43
php_uv.c
@ -294,6 +294,13 @@ void static destruct_uv_lock(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
||||
lock->locked = 0x00;
|
||||
}
|
||||
uv_mutex_destroy(&lock->lock.mutex);
|
||||
} else if (lock->type == IS_UV_SEMAPHORE) {
|
||||
if (lock->locked == 0x01) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "uv_sem: unlocked resoruce detected. force unlock resource.");
|
||||
uv_sem_post(&lock->lock.semaphore);
|
||||
lock->locked = 0x00;
|
||||
}
|
||||
uv_sem_destroy(&lock->lock.semaphore);
|
||||
}
|
||||
|
||||
efree(lock);
|
||||
@ -2101,6 +2108,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_uv_mutex_unlock, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, handle)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_uv_sem_init, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, val)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_uv_prepare_init, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, loop)
|
||||
ZEND_END_ARG_INFO()
|
||||
@ -4055,15 +4066,13 @@ PHP_FUNCTION(uv_rwlock_wrunlock)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
|
||||
/* {{{ proto uv_lock uv_mutex_init(void) */
|
||||
PHP_FUNCTION(uv_mutex_init)
|
||||
{
|
||||
php_uv_lock_t *mutex;
|
||||
int error;
|
||||
|
||||
mutex = emalloc(sizeof(php_uv_t));
|
||||
mutex = emalloc(sizeof(php_uv_lock_t));
|
||||
error = uv_mutex_init(&mutex->lock.mutex);
|
||||
if (error == 0) {
|
||||
ZEND_REGISTER_RESOURCE(return_value, mutex, uv_lock_handle);
|
||||
@ -4134,6 +4143,32 @@ PHP_FUNCTION(uv_mutex_unlock)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto uv_lock uv_sem_init(void) */
|
||||
PHP_FUNCTION(uv_sem_init)
|
||||
{
|
||||
php_uv_lock_t *semaphore;
|
||||
int error = 0;
|
||||
unsigned long val = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
||||
"l", &val) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
semaphore = emalloc(sizeof(php_uv_lock_t));
|
||||
error = uv_sem_init(&semaphore->lock.semaphore, val);
|
||||
|
||||
if (error == 0) {
|
||||
ZEND_REGISTER_RESOURCE(return_value, semaphore, uv_lock_handle);
|
||||
semaphore->type = IS_UV_SEMAPHORE;
|
||||
} else {
|
||||
efree(semaphore);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ */
|
||||
PHP_FUNCTION(uv_prepare_init)
|
||||
{
|
||||
@ -5556,6 +5591,8 @@ static zend_function_entry uv_functions[] = {
|
||||
PHP_FE(uv_mutex_lock, arginfo_uv_mutex_lock)
|
||||
PHP_FE(uv_mutex_trylock, arginfo_uv_mutex_trylock)
|
||||
PHP_FE(uv_mutex_unlock, arginfo_uv_mutex_unlock)
|
||||
/* semaphore */
|
||||
PHP_FE(uv_sem_init, NULL)
|
||||
/* prepare (before poll hook) */
|
||||
PHP_FE(uv_prepare_init, NULL)
|
||||
PHP_FE(uv_prepare_start, arginfo_uv_prepare_start)
|
||||
|
4
php_uv.h
4
php_uv.h
@ -32,7 +32,8 @@ extern zend_class_entry *uv_class_entry;
|
||||
|
||||
enum php_uv_lock_type{
|
||||
IS_UV_RWLOCK = 1,
|
||||
IS_UV_MUTEX = 2
|
||||
IS_UV_MUTEX = 2,
|
||||
IS_UV_SEMAPHORE = 3,
|
||||
};
|
||||
|
||||
enum php_uv_resource_type{
|
||||
@ -131,6 +132,7 @@ typedef struct {
|
||||
union {
|
||||
uv_rwlock_t rwlock;
|
||||
uv_mutex_t mutex;
|
||||
uv_sem_t semaphore;
|
||||
} lock;
|
||||
} php_uv_lock_t;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user