コード例 #1
0
ファイル: background.c プロジェクト: serjepatoff/vifm
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();
}
コード例 #2
0
ファイル: events.c プロジェクト: alayasix/LuoYunCloud
/* 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;
}