1. 程式人生 > >swoole_process原始碼分析之setBlocking操作

swoole_process原始碼分析之setBlocking操作

swoole_process提供的setBlocking用於設定管道是否為阻塞模式。預設Process的管道為同步阻塞。

function swoole_process->setBlocking(bool $blocking = true);
  • $blocking 布林型,預設為true,設定為false時管道為非阻塞模式

下面我們看看其實現。

static PHP_METHOD(swoole_process, setBlocking)
{
    zend_bool blocking;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &blocking) == FAILURE)
    {
        RETURN_FALSE;
    }

    swWorker *process = swoole_get_object(getThis());
    if (process->pipe == 0)
    {
        swoole_php_fatal_error(E_WARNING, "no pipe, can not setBlocking the pipe.");
        RETURN_FALSE;
    }
    if (blocking)
    {
        swSetBlock(process->pipe);
    }
    else
    {
        swSetNonBlock(process->pipe);
    }
    if (SwooleG.main_reactor)
    {
        swConnection *_socket = swReactor_get(SwooleG.main_reactor, process->pipe);
        if (_socket)
        {
            _socket->nonblock = blocking ? 0 : 1;
        }
    }
}
void swoole_ioctl_set_block(int sock, int nonblock)
{
    int ret;
    do
    {
        ret = ioctl(sock, FIONBIO, &nonblock);
    }
    while (ret == -1 && errno == EINTR);

    if (ret < 0)
    {
        swSysError("ioctl(%d, FIONBIO, %d) failed.", sock, nonblock);
    }
}