static void* thread_do(thpool_t* p) { job_t j; while (true) { while (p->running && jobqueue_pop(p->queue, &j)) { j.function(j.args); } if (!p->running) break; pthread_mutex_lock(&p->update_mutex); pthread_cond_wait(&p->update_cv, &p->update_mutex); pthread_mutex_unlock(&p->update_mutex); } pthread_exit(NULL); }
/**************************************************************************** Message Handler: grab_job() -> no_job(), job_assign(handle, func, arg) ****************************************************************************/ int msg_grab_job(Client *cli, unsigned char *arg, int argsize) { Job *job = NULL; Ability *ability = NULL; int nabilities = cli->abilities->len; int i; for(i = 0; i < nabilities && !job; i++) { cli->ability_iter = (cli->ability_iter + 1) % nabilities; ability = g_ptr_array_index(cli->abilities, cli->ability_iter); job = jobqueue_pop(g_jobqueue, ability->func); } if (!job) { #if DEBUG g_debug("[%s] grab_job - no job", cli->id); #endif MemBlock *block = simple_response(MSG_NO_JOB); client_send(cli, block); } else { #if DEBUG g_debug("[%s] grab_job - assigned %s %s", cli->id, ability->func, job->handle); #endif job->worker = cli; client_add_working(cli, job); int data_len = strlen(job->handle) + strlen(job->func) + job->arg_len + 2; MemBlock *block = new_response(MSG_JOB_ASSIGN, data_len, NULL); unsigned char *p = block->bytes + HEADER_SIZE; p += sprintf((char*)p, job->handle) + 1; p += sprintf((char*)p, job->func) + 1; memcpy(p, job->arg, job->arg_len); client_send(cli, block); if (ability->timeout > 0) { struct timeval tv = {ability->timeout, 0}; job->timeout = ability->timeout; evtimer_set(&job->work_timer, (void*)_work_timeout, job); evtimer_add(&job->work_timer, &tv); } } return 0; }