static int co_socket_onWritable(swReactor *reactor, swEvent *event) { util_socket *sock = (util_socket *) event->socket->object; php_context *context = &sock->context; zval *retval = NULL; zval result; reactor->del(reactor, sock->fd); if (sock->timer) { swTimer_del(&SwooleG.timer, sock->timer); sock->timer = NULL; } int n = write(sock->fd, context->private_data, sock->nbytes); if (n < 0) { SwooleG.error = errno; ZVAL_FALSE(&result); } else { ZVAL_LONG(&result, n); } int ret = coro_resume(context, &result, &retval); zval_ptr_dtor(&result); if (ret == CORO_END && retval) { zval_ptr_dtor(retval); } efree(sock); return SW_OK; }
static sw_inline void execute_onConnect(swClient *cli) { if (cli->timer) { swTimer_del(&SwooleG.timer, cli->timer); cli->timer = NULL; } cli->onConnect(cli); }
static int co_socket_onReadable(swReactor *reactor, swEvent *event) { util_socket *sock = (util_socket *) event->socket->object; php_context *context = &sock->context; zval *retval = NULL; zval result; reactor->del(reactor, sock->fd); if (sock->timer) { swTimer_del(&SwooleG.timer, sock->timer); sock->timer = NULL; } int n = read(sock->fd, sock->buf->val, sock->nbytes); if (n < 0) { ZVAL_FALSE(&result); zend_string_free(sock->buf); } else if (n == 0) { ZVAL_EMPTY_STRING(&result); zend_string_free(sock->buf); } else { sock->buf->val[n] = 0; sock->buf->len = n; ZVAL_STR(&result, sock->buf); } int ret = coro_resume(context, &result, &retval); zval_ptr_dtor(&result); if (ret == CORO_END && retval) { zval_ptr_dtor(retval); } efree(sock); return SW_OK; }
void php_swoole_clear_all_timer() { if (!SwooleG.timer.map) { return; } uint64_t timer_id; //kill user process while (1) { swTimer_node *tnode = swHashMap_each_int(SwooleG.timer.map, &timer_id); if (tnode == NULL) { break; } if (tnode->type != SW_TIMER_TYPE_PHP) { continue; } php_swoole_del_timer(tnode TSRMLS_CC); swTimer_del(&SwooleG.timer, tnode); } }
static void php_swoole_dns_callback_coro(char *domain, swDNSResolver_result *result, void *data) { SWOOLE_GET_TSRMLS; dns_request *req = data; zval *retval = NULL; zval *zaddress; char *address; SW_MAKE_STD_ZVAL(zaddress); if (result->num > 0) { if (SwooleG.dns_lookup_random) { address = result->hosts[rand() % result->num].address; } else { address = result->hosts[0].address; } SW_ZVAL_STRING(zaddress, address, 1); } else { SW_ZVAL_STRING(zaddress, "", 1); } //update cache dns_cache *cache = swHashMap_find(request_cache_map, Z_STRVAL_P(req->domain), Z_STRLEN_P(req->domain)); if (cache == NULL ) { cache = emalloc(sizeof(dns_cache)); swHashMap_add(request_cache_map, Z_STRVAL_P(req->domain), Z_STRLEN_P(req->domain), cache); cache->zaddress = swString_new(20); } swString_write_ptr(cache->zaddress, 0, Z_STRVAL_P(zaddress), Z_STRLEN_P(zaddress)); cache->update_time = (int64_t) swTimer_get_now_msec + (int64_t) (SwooleG.dns_cache_refresh_time * 1000); //timeout if (req->timer) { swTimer_del(&SwooleG.timer, req->timer); req->timer = NULL; } if (req->useless) { efree(req); return; } int ret = coro_resume(req->context, zaddress, &retval); if (ret > 0) { goto free_zdata; } if (retval != NULL) { sw_zval_ptr_dtor(&retval); } //说明已经yield走了 free_zdata: // free 上下文 sw_zval_ptr_dtor(&zaddress); efree(req->context); efree(req); }
static int swClient_close(swClient *cli) { int fd = cli->socket->fd; assert(fd != 0); #ifdef SW_USE_OPENSSL if (cli->open_ssl && cli->ssl_context) { if (cli->socket->ssl) { swSSL_close(cli->socket); } swSSL_free_context(cli->ssl_context); if (cli->ssl_option.cert_file) { sw_free(cli->ssl_option.cert_file); } if (cli->ssl_option.key_file) { sw_free(cli->ssl_option.key_file); } if (cli->ssl_option.passphrase) { sw_free(cli->ssl_option.passphrase); } #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME if (cli->ssl_option.tls_host_name) { sw_free(cli->ssl_option.tls_host_name); } #endif if (cli->ssl_option.cafile) { sw_free(cli->ssl_option.cafile); } if (cli->ssl_option.capath) { sw_free(cli->ssl_option.capath); } } #endif //clear buffer if (cli->buffer) { swString_free(cli->buffer); cli->buffer = NULL; } if (cli->type == SW_SOCK_UNIX_DGRAM) { unlink(cli->socket->info.addr.un.sun_path); } if (cli->socket->closed) { return SW_OK; } cli->socket->closed = 1; if (cli->async) { //remove from reactor if (!cli->socket->removed && SwooleG.main_reactor) { SwooleG.main_reactor->del(SwooleG.main_reactor, fd); } if (cli->timer) { swTimer_del(&SwooleG.timer, cli->timer); cli->timer = NULL; } //onClose callback if (cli->socket->active && cli->onClose) { cli->socket->active = 0; cli->onClose(cli); } } else { cli->socket->active = 0; } return close(fd); }