void check_background_jobs(void) { job_t *head = jobs; job_t *prev; job_t *p; /* Quit if there is no jobs or list is unavailable (e.g. used by another * invocation of this function). */ if(head == NULL) { return; } if(bg_jobs_freeze() != 0) { return; } head = jobs; jobs = NULL; p = head; prev = NULL; while(p != NULL) { job_check(p); /* Remove job if it is finished now. */ if(!p->running) { job_t *j = p; if(prev != NULL) prev->next = p->next; else head = p->next; p = p->next; if(j->type == BJT_OPERATION) { ui_stat_job_bar_remove(&j->bg_op); } job_free(j); } else { prev = p; p = p->next; } } assert(jobs == NULL && "Job list shouldn't be used by anyone."); jobs = head; bg_jobs_unfreeze(); }
/* process new job request from web */ static int __process_web_job(char * buf, int size, int ent_id) { logdebug(_("%s called\n"), __func__); if (size != sizeof(int32_t)) { logerror(_("unexpected web job data size\n")); return -1; } int job_id = *(int32_t *)buf; logdebug(_("web job id %d\n"), job_id); LYJobInfo *job = malloc(sizeof(LYJobInfo)); if (job == NULL) { logerror(_("error in %s(%d)\n"), __func__, __LINE__); return -1; } job->j_id = job_id; if (db_job_get(job) != 0) { logerror(_("error in %s(%d)\n"), __func__, __LINE__); free(job); return -1; } if (job_exist(job)){ logwarn(_("job %d exists already\n"), job_id); free(job); return 0; } int ret = job_check(job); if (ret){ logwarn(_("job check for job %d returns %d\n"), job_id, ret); if (!JOB_IS_CANCELLED(ret)) ret = LY_S_CANCEL_INTERNAL_ERROR; /* can not use job_remove */ time(&job->j_started); time(&job->j_ended); job->j_status = ret; db_job_update_status(job); free(job); return 0; } if (job_insert(job) != 0) { logerror(_("error in %s(%d)\n"), __func__, __LINE__); time(&job->j_started); time(&job->j_ended); job->j_status = LY_S_CANCEL_INTERNAL_ERROR; db_job_update_status(job); free(job); return -1; } return 0; }