PHP_METHOD(swoole_atomic, wait) { double timeout = 1.0; sw_atomic_t *atomic = swoole_get_object(getThis()); #ifdef FAST_ZPP ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL Z_PARAM_DOUBLE(timeout) ZEND_PARSE_PARAMETERS_END(); #else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|d", &timeout) == FAILURE) { RETURN_FALSE; } #endif #ifdef HAVE_FUTEX SW_CHECK_RETURN(swoole_futex_wait(atomic, timeout)); #else timeout = timeout <= 0 ? SW_MAX_INT : timeout; while (timeout > 0) { if (sw_atomic_cmp_set(atomic, 1, 0)) { RETURN_TRUE; } else { usleep(1000); timeout -= 0.001; } } #endif }
static PHP_METHOD(swoole_server_port, on) { char *ha_name = NULL; zend_size_t len, i; int ret = -1; zval *cb; if (SwooleGS->start > 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Server is running. Unable to set event callback now."); RETURN_FALSE; } if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "sz", &ha_name, &len, &cb) == FAILURE) { return; } swoole_port_callbacks *callbacks = swoole_get_property(getThis(), 0); swListenPort *port = swoole_get_object(getThis()); if (!port->ptr) { port->ptr = callbacks; } char *callback[PHP_SERVER_PORT_CALLBACK_NUM] = { "connect", "receive", "close", "packet", }; for (i = 0; i < PHP_SERVER_PORT_CALLBACK_NUM; i++) { if (strncasecmp(callback[i], ha_name, len) == 0) { ret = php_swoole_set_callback(callbacks->array, i, cb TSRMLS_CC); if (i == SW_SERVER_CB_onConnect && SwooleG.serv->onConnect == NULL) { SwooleG.serv->onConnect = php_swoole_onConnect; } else if (i == SW_SERVER_CB_onClose && SwooleG.serv->onClose == NULL) { SwooleG.serv->onClose = php_swoole_onClose; } break; } } if (ret < 0) { swoole_php_error(E_WARNING, "Unknown event types[%s]", ha_name); } SW_CHECK_RETURN(ret); }
static PHP_METHOD(swoole_redis, get) { zval *callback; char *key; zend_size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &key, &key_len, &callback) == FAILURE) { return; } SW_CHECK_RETURN(swoole_redis_send_command(getThis(), callback, "GET %s", key)); }
static PHP_METHOD(swoole_redis, execute) { zval *callback; char *command; zend_size_t command_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &command, &command_len, &callback) == FAILURE) { return; } SW_CHECK_RETURN(swoole_redis_send_command(getThis(), callback, command, command_len)); }
static PHP_METHOD(swoole_buffer, expand) { long size = -1; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size) == FAILURE) { RETURN_FALSE; } swString *buffer = swoole_get_object(getThis()); if (size <= buffer->size) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "new size must more than %ld", buffer->size); RETURN_FALSE; } zend_update_property_long(swoole_buffer_class_entry_ptr, getThis(), ZEND_STRL("capacity"), size TSRMLS_CC); SW_CHECK_RETURN(swString_extend(buffer, size)); }
static PHP_METHOD(swoole_websocket_server, push) { zval *zdata; long fd = 0; long opcode = WEBSOCKET_OPCODE_TEXT_FRAME; zend_bool fin = 1; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz|lb", &fd, &zdata, &opcode, &fin) == FAILURE) { return; } if (fd <= 0) { swoole_php_fatal_error(E_WARNING, "fd[%d] is invalid.", (int )fd); RETURN_FALSE; } if (opcode > WEBSOCKET_OPCODE_PONG) { swoole_php_fatal_error(E_WARNING, "opcode max 10"); RETURN_FALSE; } char *data; int length = php_swoole_get_send_data(zdata, &data TSRMLS_CC); if (length < 0) { RETURN_FALSE; } else if (length == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "data is empty."); RETURN_FALSE; } swConnection *conn = swWorker_get_connection(SwooleG.serv, fd); if (!conn || conn->websocket_status < WEBSOCKET_STATUS_HANDSHAKE) { swoole_php_fatal_error(E_WARNING, "connection[%d] is not a websocket client.", (int ) fd); RETURN_FALSE; } swString_clear(swoole_http_buffer); swWebSocket_encode(swoole_http_buffer, data, length, opcode, (int) fin, 0); SW_CHECK_RETURN(swServer_tcp_send(SwooleG.serv, fd, swoole_http_buffer->str, swoole_http_buffer->length)); }
static PHP_METHOD(swoole_msgqueue, push) { char *data; size_t length; long type = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &data, &length, &type) == FAILURE) { RETURN_FALSE; } swQueue_data *in = (swQueue_data *) emalloc(length + sizeof(long) + 1); in->mtype = type; memcpy(in->mdata, data, length + 1); swMsgQueue *queue = swoole_get_object(getThis()); int ret = swMsgQueue_push(queue, in, length); efree(in); SW_CHECK_RETURN(ret); }
PHP_METHOD(swoole_atomic, wakeup) { zend_long n = 1; sw_atomic_t *atomic = swoole_get_object(getThis()); #ifdef FAST_ZPP ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL Z_PARAM_LONG(n) ZEND_PARSE_PARAMETERS_END(); #else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &n) == FAILURE) { RETURN_FALSE; } #endif #ifdef HAVE_FUTEX SW_CHECK_RETURN(swoole_futex_wakeup(atomic, (int ) n)); #else *atomic = 1; #endif }
static PHP_METHOD(swoole_msgqueue, destory) { swMsgQueue *queue = swoole_get_object(getThis()); SW_CHECK_RETURN(swMsgQueue_free(queue)); }