3 Commits
6 changed files with 144 additions and 45 deletions
+10 -11
View File
@@ -1,14 +1,13 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Copyright 2019 Denis "ftc" Denisov
Version 2, December 2004
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
http://www.apache.org/licenses/LICENSE-2.0
Everyone is permitted to copy and distribute verbatim or modified copies of
this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+54
View File
@@ -69,10 +69,64 @@ Returns `true` on success, `false` otherwise.
### posix_sem_post($semaphore)
Unlocks semaphore. If the semaphore's value consequently becomes greater than zero, then
another process or thread blocked in a sem_wait call will be woken
up and proceed to lock the semaphore.
Parameters:
* $semaphore - semaphore resource to unlock (acquired via `posix_sem_open`).
Returns `true` on success, `false` otherwise.
### posix_sem_wait($semaphore)
Locks a semaphore. If
the semaphore's value is greater than zero, then the decrement
proceeds, and the function returns, immediately. If the semaphore
currently has the value zero, then the call blocks until either it
becomes possible to perform the decrement (i.e., the semaphore value
rises above zero), or a signal handler interrupts the call.
Parameters:
* $semaphore - semaphore resource to unlock (acquired via `posix_sem_open`).
Returns `true` on success, `false` otherwise.
### posix_sem_trywait($semaphore)
The same as `posix_sem_wait`, except that if the decrement
cannot be immediately performed, then call returns an error (last error
set to EAGAIN) instead of blocking.
### posix_sem_timedwait($semaphore, $timeout_sec, $timeout_nsec = 0)
Tries to lock a semaphore (as `posix_sem_wait`), but if lock could not
be performed in a specified timeout, returns and sets last error to ETIMEDOUT.
Parameters:
* $semaphore - semaphore resource to unlock (acquired via `posix_sem_open`).
* $timeout_sec - part of the timeout in seconds.
* $timeout_nsec - part of the timeout in nanoseconds.
Total timeout is computed as `$timeout_sec * 1000000000 + $timeout_nsec` and is
measured in nanoseconds.
### posix_sem_getvalue($semaphore)
Gets value of specified semaphore.
Parameters:
* $semaphore - semaphore resource which value to get (acquired via `posix_sem_open`).
Returns semaphore value on success and `null` on error.
Please note that underlying function `sem_getvalue` can behave differently according to
POSIX specification, so please read your OS documentation on that.
### posix_sem_error()
Returns value of last error occured during call of another semaphore-related function.
## Notes for PHP users
+32 -33
View File
@@ -11,15 +11,15 @@
#include <fcntl.h>
static zend_function_entry posix_semaphores_functions[] = {
PHP_FE(posix_sem_open, NULL)
PHP_FE(posix_sem_close, NULL)
PHP_FE(posix_sem_unlink, NULL)
PHP_FE(posix_sem_getvalue, NULL)
PHP_FE(posix_sem_post, NULL)
PHP_FE(posix_sem_wait, NULL)
PHP_FE(posix_sem_trywait, NULL)
PHP_FE(posix_sem_timedwait, NULL)
PHP_FE(posix_sem_error, NULL)
PHP_FE(posix_sem_open, arginfo_posix_sem_open)
PHP_FE(posix_sem_close, arginfo_posix_sem_close)
PHP_FE(posix_sem_unlink, arginfo_posix_sem_unlink)
PHP_FE(posix_sem_getvalue, arginfo_posix_sem_getvalue)
PHP_FE(posix_sem_post, arginfo_posix_sem_post)
PHP_FE(posix_sem_wait, arginfo_posix_sem_wait)
PHP_FE(posix_sem_trywait, arginfo_posix_sem_trywait)
PHP_FE(posix_sem_timedwait, arginfo_posix_sem_timedwait)
PHP_FE(posix_sem_error, arginfo_posix_sem_error)
{NULL, NULL, NULL}
};
@@ -51,7 +51,7 @@ typedef struct _php_posix_semaphore {
} php_posix_semaphore;
static void php_posix_semaphore_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
static void php_posix_semaphore_dtor(zend_resource *rsrc)
{
php_posix_semaphore *s = (php_posix_semaphore*)rsrc->ptr;
if (s)
@@ -92,11 +92,11 @@ PHP_MSHUTDOWN_FUNCTION(posix_semaphores)
PHP_FUNCTION(posix_sem_open)
{
char *name;
int name_length;
long flags;
long mode = 0666;
long value = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|ll", &name, &name_length, &flags, &mode, &value) == FAILURE)
size_t name_length;
zend_long flags;
zend_long mode = 0666;
zend_long value = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|ll", &name, &name_length, &flags, &mode, &value) == FAILURE)
{
RETURN_NULL();
}
@@ -108,19 +108,18 @@ PHP_FUNCTION(posix_sem_open)
}
php_posix_semaphore *semaphore = emalloc(sizeof(php_posix_semaphore));
semaphore->sem = sem;
ZEND_REGISTER_RESOURCE(return_value, semaphore, le_posix_semaphore);
ZVAL_RES(return_value, zend_register_resource(semaphore, le_posix_semaphore));
}
PHP_FUNCTION(posix_sem_close)
{
php_posix_semaphore *semaphore;
zval *zsemaphore;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zsemaphore) == FAILURE)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zsemaphore) == FAILURE)
{
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(semaphore, php_posix_semaphore*, &zsemaphore, -1, PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
semaphore = (php_posix_semaphore*)zend_fetch_resource(Z_RES_P(zsemaphore), PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
if (semaphore->sem)
{
if (sem_close(semaphore->sem) == -1)
@@ -137,8 +136,8 @@ PHP_FUNCTION(posix_sem_close)
PHP_FUNCTION(posix_sem_unlink)
{
char *name;
int name_length;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_length) == FAILURE)
size_t name_length;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_length) == FAILURE)
{
RETURN_NULL();
}
@@ -154,12 +153,12 @@ PHP_FUNCTION(posix_sem_getvalue)
{
php_posix_semaphore *semaphore;
zval *zsemaphore;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zsemaphore) == FAILURE)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zsemaphore) == FAILURE)
{
RETURN_NULL();
}
ZEND_FETCH_RESOURCE(semaphore, php_posix_semaphore*, &zsemaphore, -1, PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
semaphore = (php_posix_semaphore*)zend_fetch_resource(Z_RES_P(zsemaphore), PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
if (semaphore->sem)
{
int value;
@@ -183,12 +182,12 @@ PHP_FUNCTION(posix_sem_post)
{
php_posix_semaphore *semaphore;
zval *zsemaphore;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zsemaphore) == FAILURE)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zsemaphore) == FAILURE)
{
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(semaphore, php_posix_semaphore*, &zsemaphore, -1, PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
semaphore = (php_posix_semaphore*)zend_fetch_resource(Z_RES_P(zsemaphore), PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
if (semaphore->sem)
{
if (sem_post(semaphore->sem) == -1)
@@ -211,12 +210,12 @@ PHP_FUNCTION(posix_sem_wait)
{
php_posix_semaphore *semaphore;
zval *zsemaphore;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zsemaphore) == FAILURE)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zsemaphore) == FAILURE)
{
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(semaphore, php_posix_semaphore*, &zsemaphore, -1, PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
semaphore = (php_posix_semaphore*)zend_fetch_resource(Z_RES_P(zsemaphore), PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
if (semaphore->sem)
{
if (sem_wait(semaphore->sem) == -1)
@@ -239,12 +238,12 @@ PHP_FUNCTION(posix_sem_trywait)
{
php_posix_semaphore *semaphore;
zval *zsemaphore;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zsemaphore) == FAILURE)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zsemaphore) == FAILURE)
{
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(semaphore, php_posix_semaphore*, &zsemaphore, -1, PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
semaphore = (php_posix_semaphore*)zend_fetch_resource(Z_RES_P(zsemaphore), PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
if (semaphore->sem)
{
if (sem_trywait(semaphore->sem) == -1)
@@ -267,14 +266,14 @@ PHP_FUNCTION(posix_sem_timedwait)
{
php_posix_semaphore *semaphore;
zval *zsemaphore;
long timeout_sec;
long timeout_nsec = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|l", &zsemaphore, &timeout_sec, &timeout_nsec) == FAILURE)
zend_long timeout_sec;
zend_long timeout_nsec = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|l", &zsemaphore, &timeout_sec, &timeout_nsec) == FAILURE)
{
RETURN_FALSE;
}
ZEND_FETCH_RESOURCE(semaphore, php_posix_semaphore*, &zsemaphore, -1, PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
semaphore = (php_posix_semaphore*)zend_fetch_resource(Z_RES_P(zsemaphore), PHP_POSIX_SEMAPHORES_RES_NAME, le_posix_semaphore);
if (semaphore->sem)
{
struct timespec tm;
+3 -1
View File
@@ -1,9 +1,11 @@
#ifndef POSIX_SEMAPHORES_H
#define POSIX_SEMAPHORES_H 1
#define PHP_POSIX_SEMAPHORES_VERSION "1.0"
#define PHP_POSIX_SEMAPHORES_VERSION "1.1"
#define PHP_POSIX_SEMAPHORES_EXTNAME "posix_semaphores"
#include "posix_semaphores_arginfo.h"
PHP_MINIT_FUNCTION(posix_semaphores);
PHP_MSHUTDOWN_FUNCTION(posix_semaphores);
+11
View File
@@ -0,0 +1,11 @@
<?php
function posix_sem_open(string $name, int $flags, int $mode, int $value) : resource|null {}
function posix_sem_close(resource $semaphore) : boolean {}
function posix_sem_unlink(resource $semaphore) : boolean {}
function posix_sem_post(resource $semaphore) : boolean {}
function posix_sem_wait(resource $semaphore) : boolean {}
function posix_sem_trywait(resource $semaphore) : boolean {}
function posix_sem_timedwait(resource $semaphore, int $timeout_sec, int $timeout_nsec = 0) : boolean {}
function posix_sem_getvalue(resource $semaphore) : int|null {}
function posix_sem_error() : int {}
+34
View File
@@ -0,0 +1,34 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 9e3bcd8b1562df022b0491acc13c50410cec2648 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_posix_sem_open, 0, 4, resource, 1)
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, value, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_posix_sem_close, 0, 1, boolean, 0)
ZEND_ARG_OBJ_INFO(0, semaphore, resource, 0)
ZEND_END_ARG_INFO()
#define arginfo_posix_sem_unlink arginfo_posix_sem_close
#define arginfo_posix_sem_post arginfo_posix_sem_close
#define arginfo_posix_sem_wait arginfo_posix_sem_close
#define arginfo_posix_sem_trywait arginfo_posix_sem_close
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_posix_sem_timedwait, 0, 2, boolean, 0)
ZEND_ARG_OBJ_INFO(0, semaphore, resource, 0)
ZEND_ARG_TYPE_INFO(0, timeout_sec, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout_nsec, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_posix_sem_getvalue, 0, 1, IS_LONG, 1)
ZEND_ARG_OBJ_INFO(0, semaphore, resource, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_posix_sem_error, 0, 0, IS_LONG, 0)
ZEND_END_ARG_INFO()