Beispiel #1
0
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);
}
Beispiel #2
0
/****************************************************************************
  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;
}