@@ -66,6 +66,7 @@ ZEND_END_ARG_INFO()
66
66
67
67
ZEND_BEGIN_ARG_INFO_EX (arginfo_sem_acquire , 0 , 0 , 1 )
68
68
ZEND_ARG_INFO (0 , sem_identifier )
69
+ ZEND_ARG_INFO (0 , nowait )
69
70
ZEND_END_ARG_INFO ()
70
71
71
72
ZEND_BEGIN_ARG_INFO_EX (arginfo_sem_release , 0 , 0 , 1 )
@@ -298,11 +299,18 @@ PHP_FUNCTION(sem_get)
298
299
static void php_sysvsem_semop (INTERNAL_FUNCTION_PARAMETERS , int acquire )
299
300
{
300
301
zval * arg_id ;
302
+ zend_bool nowait = 0 ;
301
303
sysvsem_sem * sem_ptr ;
302
304
struct sembuf sop ;
303
305
304
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r" , & arg_id ) == FAILURE ) {
305
- return ;
306
+ if (acquire ) {
307
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r|b" , & arg_id , & nowait ) == FAILURE ) {
308
+ return ;
309
+ }
310
+ } else {
311
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r" , & arg_id ) == FAILURE ) {
312
+ return ;
313
+ }
306
314
}
307
315
308
316
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)
314
322
315
323
sop .sem_num = SYSVSEM_SEM ;
316
324
sop .sem_op = acquire ? -1 : 1 ;
317
- sop .sem_flg = SEM_UNDO ;
325
+ sop .sem_flg = SEM_UNDO | ( nowait ? IPC_NOWAIT : 0 ) ;
318
326
319
327
while (semop (sem_ptr -> semid , & sop , 1 ) == -1 ) {
320
328
if (errno != EINTR ) {
321
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "failed to %s key 0x%x: %s" , acquire ? "acquire" : "release" , sem_ptr -> key , strerror (errno ));
329
+ if (errno != EAGAIN ) {
330
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "failed to %s key 0x%x: %s" , acquire ? "acquire" : "release" , sem_ptr -> key , strerror (errno ));
331
+ }
322
332
RETURN_FALSE ;
323
333
}
324
334
}
0 commit comments