swoole_process原始碼分析之pop佇列
阿新 • • 發佈:2018-12-13
用於從佇列中讀取訊息,其呼叫如下:
string swoole_process->pop(int $maxsize = 8192);
下面我們分析下其流程。
static PHP_METHOD(swoole_process, pop) { long maxsize = SW_MSGMAX; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &maxsize) == FAILURE) { RETURN_FALSE; } if (maxsize > SW_MSGMAX || maxsize <= 0) { maxsize = SW_MSGMAX; } swWorker *process = swoole_get_object(getThis()); if (!process->queue) { swoole_php_fatal_error(E_WARNING, "no msgqueue, can not use pop()"); RETURN_FALSE; } struct { long type; char data[SW_MSGMAX]; } message; if (process->ipc_mode == 2) { message.type = 0; } else { message.type = process->id; } int n = swMsgQueue_pop(process->queue, (swQueue_data *) &message, maxsize); if (n < 0) { RETURN_FALSE; } SW_RETURN_STRINGL(message.data, n, 1); }
int swMsgQueue_pop(swMsgQueue *q, swQueue_data *data, int length) { int ret = msgrcv(q->msg_id, data, length, data->mtype, q->flags); if (ret < 0) { SwooleG.error = errno; if (errno != ENOMSG && errno != EINTR) { swSysError("msgrcv(%d, %d, %ld) failed.", q->msg_id, length, data->mtype); } } return ret; }