static gearmand_error_t _thread_packet_read(gearman_server_con_st *con) { while (1) { if (con->packet == NULL) { if (! (con->packet= gearman_server_packet_create(con->thread, true))) { return GEARMAN_MEMORY_ALLOCATION_FAILURE; } } gearmand_error_t ret; if (gearmand_failed(ret= gearman_io_recv(con, true))) { if (ret == GEARMAN_IO_WAIT) { break; } gearman_server_packet_free(con->packet, con->thread, true); con->packet= NULL; return ret; } gearmand_log_debug(GEARMAN_DEFAULT_LOG_PARAM, "Received %s %s:%u", gearman_command_info(con->packet->packet.command)->name, con->_host == NULL ? "-" : con->_host, con->_port == NULL ? "-" : con->_port); /* We read a complete packet. */ if (Server->flags.threaded) { /* Multi-threaded, queue for the processing thread to run. */ gearman_server_proc_packet_add(con, con->packet); con->packet= NULL; } else { /* Single threaded, run the command here. */ gearmand_error_t rc= gearman_server_run_command(con, &(con->packet->packet)); gearmand_packet_free(&(con->packet->packet)); gearman_server_packet_free(con->packet, con->thread, true); con->packet= NULL; if (gearmand_failed(rc)) { return rc; } } } return GEARMAN_SUCCESS; }
static void *_proc(void *data) { gearman_server_st *server= (gearman_server_st *)data; gearman_server_thread_st *thread; gearman_server_con_st *con; gearman_server_packet_st *packet; while (1) { (void) pthread_mutex_lock(&(server->proc_lock)); while (server->proc_wakeup == false) { if (server->proc_shutdown) { (void) pthread_mutex_unlock(&(server->proc_lock)); return NULL; } (void) pthread_cond_wait(&(server->proc_cond), &(server->proc_lock)); } server->proc_wakeup= false; (void) pthread_mutex_unlock(&(server->proc_lock)); for (thread= server->thread_list; thread != NULL; thread= thread->next) { while ((con= gearman_server_con_proc_next(thread)) != NULL) { if (con->is_dead) { gearman_server_con_free_workers(con); while (con->client_list != NULL) gearman_server_client_free(con->client_list); con->proc_removed= true; gearman_server_con_io_add(con); continue; } while (1) { packet= gearman_server_proc_packet_remove(con); if (packet == NULL) break; con->ret= gearman_server_run_command(con, &(packet->packet)); gearman_packet_free(&(packet->packet)); gearman_server_packet_free(packet, con->thread, false); } } } } }
gearman_return_t _thread_packet_read(gearman_server_con_st *con) { gearman_return_t ret; while (1) { if (con->packet == NULL) { con->packet= gearman_server_packet_create(con->thread, true); if (con->packet == NULL) return GEARMAN_MEMORY_ALLOCATION_FAILURE; } (void)gearman_connection_recv(&(con->con), &(con->packet->packet), &ret, true); if (ret != GEARMAN_SUCCESS) { if (ret == GEARMAN_IO_WAIT) break; gearman_server_packet_free(con->packet, con->thread, true); con->packet= NULL; return ret; } gearman_log_debug(con->thread->gearman, "%15s:%5s Received %s", con->host == NULL ? "-" : con->host, con->port == NULL ? "-" : con->port, gearman_command_info_list[con->packet->packet.command].name); /* We read a complete packet. */ if (con->thread->server->flags.threaded) { /* Multi-threaded, queue for the processing thread to run. */ gearman_server_proc_packet_add(con, con->packet); con->packet= NULL; } else { /* Single threaded, run the command here. */ ret= gearman_server_run_command(con, &(con->packet->packet)); gearman_packet_free(&(con->packet->packet)); gearman_server_packet_free(con->packet, con->thread, true); con->packet= NULL; if (ret != GEARMAN_SUCCESS) return ret; } } return GEARMAN_SUCCESS; }