From 0b648a424fd0ee7039ba4cb50b2bc64c2773b58a Mon Sep 17 00:00:00 2001 From: Matteo Beccati Date: Fri, 25 Jul 2014 11:21:47 +0200 Subject: [PATCH] FR #67990 - Added nowait argument to sem_acquire --- NEWS | 4 ++ ext/sysvsem/sysvsem.c | 18 ++++-- ext/sysvsem/tests/nowait.phpt | 103 ++++++++++++++++++++++++++++++++++ ext/sysvsem/tests/sysv.phpt | 4 +- 4 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 ext/sysvsem/tests/nowait.phpt diff --git a/NEWS b/NEWS index 3a6b250dec..5f72e2449b 100644 --- a/NEWS +++ b/NEWS @@ -45,6 +45,10 @@ PHP NEWS - Session: . Fixed bug #67972 (SessionHandler Invalid memory read create_sid()). (Adam) +- Sysvsem: + . Implemented FR #67990 (Add optional nowait argument to sem_acquire). + (Matteo) + 28 Aug 2014, PHP 5.6.0 - Apache2 Handler SAPI: diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index c30def8ba5..fce70b9e02 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -66,6 +66,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_sem_acquire, 0, 0, 1) ZEND_ARG_INFO(0, sem_identifier) + ZEND_ARG_INFO(0, nowait) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_sem_release, 0, 0, 1) @@ -298,11 +299,18 @@ PHP_FUNCTION(sem_get) static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire) { zval *arg_id; + zend_bool nowait = 0; sysvsem_sem *sem_ptr; struct sembuf sop; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg_id) == FAILURE) { - return; + if (acquire) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|b", &arg_id, &nowait) == FAILURE) { + return; + } + } else { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg_id) == FAILURE) { + return; + } } ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, &arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem); @@ -314,11 +322,13 @@ static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire) sop.sem_num = SYSVSEM_SEM; sop.sem_op = acquire ? -1 : 1; - sop.sem_flg = SEM_UNDO; + sop.sem_flg = SEM_UNDO | (nowait ? IPC_NOWAIT : 0); while (semop(sem_ptr->semid, &sop, 1) == -1) { if (errno != EINTR) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to %s key 0x%x: %s", acquire ? "acquire" : "release", sem_ptr->key, strerror(errno)); + if (errno != EAGAIN) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to %s key 0x%x: %s", acquire ? "acquire" : "release", sem_ptr->key, strerror(errno)); + } RETURN_FALSE; } } diff --git a/ext/sysvsem/tests/nowait.phpt b/ext/sysvsem/tests/nowait.phpt new file mode 100644 index 0000000000..0a6fdf4a50 --- /dev/null +++ b/ext/sysvsem/tests/nowait.phpt @@ -0,0 +1,103 @@ +--TEST-- +sem_acquire with nowait +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Parent. +P: got semaphore Resource id #%i. +P: success acquire semaphore Resource id #%i. +Child. +C: got semaphore Resource id #%i. +P: releases. +C: success acquire semaphore Resource id #%i. +C: releases. +P: success acquire semaphore Resource id #%i. +C: fail to acquire semaphore Resource id #%i. +P: cleanup. diff --git a/ext/sysvsem/tests/sysv.phpt b/ext/sysvsem/tests/sysv.phpt index 6f52f3bd7e..ccfcf03d32 100644 --- a/ext/sysvsem/tests/sysv.phpt +++ b/ext/sysvsem/tests/sysv.phpt @@ -9,8 +9,8 @@ if(!extension_loaded('sysvsem') || !extension_loaded('sysvshm')) { --FILE--