int swWorker_onTask(swFactory *factory, swEventData *task) { swServer *serv = factory->ptr; swString *package = NULL; factory->last_from_id = task->info.from_id; //worker busy serv->workers[SwooleWG.id].status = SW_WORKER_BUSY; switch (task->info.type) { //no buffer case SW_EVENT_TCP: //ringbuffer shm package case SW_EVENT_PACKAGE: //discard data if (swWorker_discard_data(serv, task) == SW_TRUE) { break; } do_task: factory->onTask(factory, task); if (!SwooleWG.run_always) { //only onTask increase the count SwooleWG.request_num--; } if (task->info.type == SW_EVENT_PACKAGE_END) { package->length = 0; } break; //chunk package case SW_EVENT_PACKAGE_START: case SW_EVENT_PACKAGE_END: //discard data if (swWorker_discard_data(serv, task) == SW_TRUE) { break; } //input buffer package = SwooleWG.buffer_input[task->info.from_id]; //merge data to package buffer memcpy(package->str + package->length, task->data, task->info.len); package->length += task->info.len; //package end if (task->info.type == SW_EVENT_PACKAGE_END) { goto do_task; } break; case SW_EVENT_UDP: case SW_EVENT_UDP6: case SW_EVENT_UNIX_DGRAM: factory->onTask(factory, task); if (!SwooleWG.run_always) { SwooleWG.request_num--; } break; case SW_EVENT_CLOSE: factory->end(factory, task->info.fd); break; case SW_EVENT_CONNECT: serv->onConnect(serv, task->info.fd, task->info.from_id); break; case SW_EVENT_FINISH: serv->onFinish(serv, task); break; case SW_EVENT_PIPE_MESSAGE: serv->onPipeMessage(serv, task); break; default: swWarn("[Worker] error event[type=%d]", (int )task->info.type); break; } //worker idle serv->workers[SwooleWG.id].status = SW_WORKER_IDLE; //stop if (SwooleWG.request_num < 0) { SwooleG.running = 0; } return SW_OK; }
int swWorker_onTask(swFactory *factory, swEventData *task) { swServer *serv = factory->ptr; swString *package = NULL; swDgramPacket *header; #ifdef SW_USE_OPENSSL swConnection *conn; #endif factory->last_from_id = task->info.from_id; //worker busy serv->workers[SwooleWG.id].status = SW_WORKER_BUSY; switch (task->info.type) { //no buffer case SW_EVENT_TCP: //ringbuffer shm package case SW_EVENT_PACKAGE: //discard data if (swWorker_discard_data(serv, task) == SW_TRUE) { break; } do_task: { serv->onReceive(serv, task); SwooleWG.request_count++; sw_atomic_fetch_add(&SwooleStats->request_count, 1); } if (task->info.type == SW_EVENT_PACKAGE_END) { package->length = 0; } break; //chunk package case SW_EVENT_PACKAGE_START: case SW_EVENT_PACKAGE_END: //discard data if (swWorker_discard_data(serv, task) == SW_TRUE) { break; } package = swWorker_get_buffer(serv, task->info.from_id); //merge data to package buffer memcpy(package->str + package->length, task->data, task->info.len); package->length += task->info.len; //package end if (task->info.type == SW_EVENT_PACKAGE_END) { goto do_task; } break; case SW_EVENT_UDP: case SW_EVENT_UDP6: case SW_EVENT_UNIX_DGRAM: package = swWorker_get_buffer(serv, task->info.from_id); swString_append_ptr(package, task->data, task->info.len); if (package->offset == 0) { header = (swDgramPacket *) package->str; package->offset = header->length; } //one packet if (package->offset == package->length - sizeof(swDgramPacket)) { SwooleWG.request_count++; sw_atomic_fetch_add(&SwooleStats->request_count, 1); serv->onPacket(serv, task); swString_clear(package); } break; case SW_EVENT_CLOSE: #ifdef SW_USE_OPENSSL conn = swServer_connection_verify(serv, task->info.fd); if (conn && conn->ssl_client_cert.length) { free(conn->ssl_client_cert.str); bzero(&conn->ssl_client_cert, sizeof(conn->ssl_client_cert.str)); } #endif factory->end(factory, task->info.fd); break; case SW_EVENT_CONNECT: #ifdef SW_USE_OPENSSL //SSL client certificate if (task->info.len > 0) { conn = swServer_connection_verify(serv, task->info.fd); conn->ssl_client_cert.str = strndup(task->data, task->info.len); conn->ssl_client_cert.size = conn->ssl_client_cert.length = task->info.len; } #endif if (serv->onConnect) { serv->onConnect(serv, &task->info); } break; case SW_EVENT_FINISH: serv->onFinish(serv, task); break; case SW_EVENT_PIPE_MESSAGE: serv->onPipeMessage(serv, task); break; default: swWarn("[Worker] error event[type=%d]", (int )task->info.type); break; } //worker idle serv->workers[SwooleWG.id].status = SW_WORKER_IDLE; //maximum number of requests, process will exit. if (!SwooleWG.run_always && SwooleWG.request_count >= SwooleWG.max_request) { SwooleG.running = 0; SwooleG.main_reactor->running = 0; } return SW_OK; }
int swWorker_onTask(swFactory *factory, swEventData *task) { swServer *serv = factory->ptr; swString *package = NULL; factory->last_from_id = task->info.from_id; //worker busy serv->workers[SwooleWG.id].status = SW_WORKER_BUSY; switch (task->info.type) { //no buffer case SW_EVENT_TCP: //ringbuffer shm package case SW_EVENT_PACKAGE: //discard data if (swWorker_discard_data(serv, task) == SW_TRUE) { break; } do_task: serv->onReceive(serv, task); SwooleWG.request_count++; sw_atomic_fetch_add(&SwooleStats->request_count, 1); if (task->info.type == SW_EVENT_PACKAGE_END) { package->length = 0; } break; //chunk package case SW_EVENT_PACKAGE_START: case SW_EVENT_PACKAGE_END: //discard data if (swWorker_discard_data(serv, task) == SW_TRUE) { break; } //input buffer package = SwooleWG.buffer_input[task->info.from_id]; //merge data to package buffer memcpy(package->str + package->length, task->data, task->info.len); package->length += task->info.len; //package end if (task->info.type == SW_EVENT_PACKAGE_END) { goto do_task; } break; case SW_EVENT_UDP: case SW_EVENT_UDP6: case SW_EVENT_UNIX_DGRAM: SwooleWG.request_count++; sw_atomic_fetch_add(&SwooleStats->request_count, 1); serv->onPacket(serv, task); break; case SW_EVENT_CLOSE: factory->end(factory, task->info.fd); break; case SW_EVENT_CONNECT: serv->onConnect(serv, task->info.fd, task->info.from_id); break; case SW_EVENT_FINISH: serv->onFinish(serv, task); break; case SW_EVENT_PIPE_MESSAGE: serv->onPipeMessage(serv, task); break; default: swWarn("[Worker] error event[type=%d]", (int )task->info.type); break; } //worker idle serv->workers[SwooleWG.id].status = SW_WORKER_IDLE; //maximum number of requests, process will exit. if (!SwooleWG.run_always && SwooleWG.request_count >= SwooleWG.max_request) { SwooleG.running = 0; SwooleG.main_reactor->running = 0; } return SW_OK; }