int add_dmq_job(struct sip_msg* msg, dmq_peer_t* peer) { int i, found_available = 0; dmq_job_t new_job = { 0 }; dmq_worker_t* worker; new_job.f = peer->callback; new_job.msg = msg; new_job.orig_peer = peer; if(!num_workers) { LM_ERR("error in add_dmq_job: no workers spawned\n"); return -1; } /* initialize the worker with the first one */ worker = workers; /* search for an available worker, or, if not possible, for the least busy one */ for(i = 0; i < num_workers; i++) { if(job_queue_size(workers[i].queue) == 0) { worker = &workers[i]; found_available = 1; break; } else if(job_queue_size(workers[i].queue) < job_queue_size(worker->queue)) { worker = &workers[i]; } } if(!found_available) { LM_DBG("no available worker found, passing job to the least busy one [%d %d]\n", worker->pid, job_queue_size(worker->queue)); } job_queue_push(worker->queue, &new_job); lock_release(&worker->lock); return 0; }
void *job_queue_push_thread(void *argv){ job_queue_push(); return NULL; }//void