This repository has been archived on 2018-04-01. You can view files and clone it, but cannot push or open issues or pull requests.
php-asio/src/signal.cpp

91 lines
2.5 KiB
C++

/**
* php-asio/signal.cpp
*
* @author CismonX<admin@cismon.net>
*/
#include "signal.hpp"
#include "future.hpp"
namespace asio
{
zval* signal::handler(const boost::system::error_code& error,
int signal, zval* callback, zval* argument)
{
PHP_ASIO_INVOKE_CALLBACK_START(4);
ZVAL_LONG(&arguments[1], static_cast<zend_long>(signal));
PHP_ASIO_INVOKE_CALLBACK();
PHP_ASIO_INVOKE_CALLBACK_END();
CORO_RETURN(ZVAL_LONG, static_cast<zend_long>(signal));
}
P3_METHOD(signal, add)
{
size_t sig_len = 0;
zval* sig_num = nullptr;
ZEND_PARSE_PARAMETERS_START(1, -1)
Z_PARAM_VARIADIC('+', sig_num, sig_len)
ZEND_PARSE_PARAMETERS_END();
boost::system::error_code ec;
for (size_t i = 0; i < sig_len; i++) {
if (Z_TYPE(sig_num[i]) != IS_LONG) {
PHP_ASIO_ERROR(E_NOTICE, "Integer value expected.");
continue;
}
signal_.add(static_cast<int>(Z_LVAL(sig_num[i])), ec);
if (ec)
break;
}
RETVAL_EC(ec);
}
P3_METHOD(signal, remove)
{
size_t sig_len = 0;
zval* sig_num = nullptr;
ZEND_PARSE_PARAMETERS_START(1, -1)
Z_PARAM_VARIADIC('+', sig_num, sig_len)
ZEND_PARSE_PARAMETERS_END();
boost::system::error_code ec;
for (size_t i = 0; i < sig_len; i++) {
if (Z_TYPE(sig_num[i]) != IS_LONG) {
PHP_ASIO_ERROR(E_NOTICE, "Integer value expected.");
continue;
}
signal_.remove(static_cast<int>(Z_LVAL(sig_num[i])), ec);
if (ec)
break;
}
RETVAL_EC(ec);
}
P3_METHOD(signal, wait)
{
zval* callback = nullptr;
zval* argument = nullptr;
ZEND_PARSE_PARAMETERS_START(0, 2)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(callback)
Z_PARAM_ZVAL(argument)
ZEND_PARSE_PARAMETERS_END();
PHP_ASIO_FUTURE_INIT();
future->on_resolve<int>(boost::bind(&signal::handler, this, _1, _2, cb, args));
signal_.async_wait(STRAND_RESOLVE(ASYNC_HANDLER_DOUBLE_ARG(int)));
FUTURE_RETURN();
}
P3_METHOD(signal, clear)
{
boost::system::error_code ec;
RETVAL_EC(signal_.clear(ec));
}
P3_METHOD(signal, cancel)
{
boost::system::error_code ec;
RETVAL_EC(signal_.cancel(ec));
}
PHP_ASIO_CE_DEFINE(signal);
}