void queue_del(JOB *job) { if (job) { debug_printf("queue_del %p\n", (void *)job); // special handling for automatic robots.txt jobs if (job->deferred) { JOB new_job = { .iri = NULL }; if (job->host) job->host->robot_job = NULL; mget_iri_free(&job->iri); // create a job for each deferred IRI for (int it = 0; it < mget_vector_size(job->deferred); it++) { new_job.iri = mget_vector_get(job->deferred, it); new_job.local_filename = get_local_filename(new_job.iri); queue_add_job(&new_job); } } job_free(job); mget_thread_mutex_lock(&mutex); mget_list_remove(&queue, job); mget_thread_mutex_unlock(&mutex); }
/* * Adds a new job on the thread pool to be executed */ int pool_add_job(thread_pool_t* pool, void* (*func) (void*), void* arg) { if(pool == NULL || func == NULL) { return 0; } job_t* job = (job_t*) malloc(sizeof(job_t)); job->func = func; job->arg = arg; job->next = NULL; pthread_mutex_lock(&pool->mutex); queue_add_job(&pool->queue, job); pthread_cond_signal(&pool->has_jobs); pthread_mutex_unlock(&pool->mutex); return 1; }