int swFactory_dispatch(swFactory *factory, swDispatchData *task) { swServer *serv = SwooleG.serv; factory->last_from_id = task->data.info.from_id; if (swEventData_is_stream(task->data.info.type)) { swConnection *conn = swServer_connection_get(serv, task->data.info.fd); if (conn == NULL || conn->active == 0) { swWarn("dispatch[type=%d] failed, connection#%d is not active.", task->data.info.type, task->data.info.fd); return SW_ERR; } //server active close, discard data. if (conn->closed) { swWarn("dispatch[type=%d] failed, connection#%d is closed by server.", task->data.info.type, task->data.info.fd); return SW_OK; } //converted fd to session_id task->data.info.fd = conn->session_id; task->data.info.from_fd = conn->from_fd; } return swWorker_onTask(factory, &task->data); }
/** * receive data from reactor */ static int swWorker_onPipeReceive(swReactor *reactor, swEvent *event) { swEventData task; swServer *serv = reactor->ptr; swFactory *factory = &serv->factory; int ret; read_from_pipe: if (read(event->fd, &task, sizeof(task)) > 0) { ret = swWorker_onTask(factory, &task); #ifndef SW_WORKER_RECV_AGAIN /** * Big package */ if (task.info.type == SW_EVENT_PACKAGE_START) #endif { //no data if (ret < 0 && errno == EAGAIN) { return SW_OK; } else if (ret > 0) { goto read_from_pipe; } } return ret; } return SW_ERR; }
static int swFactoryThread_onTask(swThreadPool *pool, void *data, int len) { swFactory *factory = pool->ptr2; int ret = swWorker_onTask(factory, (swEventData*) data); sw_free(data); return ret; }
int swFactory_notify(swFactory *factory, swDataHead *info) { swServer *serv = factory->ptr; swConnection *conn = swServer_connection_get(serv, info->fd); if (conn == NULL || conn->active == 0) { swWarn("dispatch[type=%d] failed, connection#%d is not active.", info->type, info->fd); return SW_ERR; } //server active close, discard data. if (conn->closed) { swWarn("dispatch[type=%d] failed, connection#%d is closed by server.", info->type, info->fd); return SW_OK; } //converted fd to session_id info->fd = conn->session_id; info->from_fd = conn->from_fd; return swWorker_onTask(factory, (swEventData *) info); }
int swFactory_notify(swFactory *factory, swDataHead *req) { return swWorker_onTask(factory, (swEventData *) req); }