int add_work()

in common/util/util_worker.c [77:130]


int add_work(worker_job *job)
{
	if (work_count >= MAX_WORK_COUNT) {
		printk("add_work work queue full\n");
		return -1;
	}

	int ret;
	work_info *new_job;
	new_job = malloc(sizeof(work_info));
	if (new_job == NULL) {
		printk("add_work malloc fail\n");
		return -2;
	}
	memset(new_job, 0, sizeof(work_info));

	new_job->fn = job->fn;
	new_job->ptr_arg = job->ptr_arg;
	new_job->ui32_arg = job->ui32_arg;
	if (job->name != NULL) {
		snprintf(new_job->name, sizeof(new_job->name), "%s", job->name);
	}

	if (k_mutex_lock(&mutex_use_count, K_MSEC(1000))) {
		printk("add_work mutex lock fail\n");
		free(new_job);
		return -3;
	}

	if (job->delay_ms == 0) { /* no need to be delayed */
		k_work_init(&(new_job->work.normal_work), work_handler);
		ret = k_work_submit_to_queue(&worker_work_q, &(new_job->work.normal_work));
		if (ret != 1) { /* queued fail */
			printk("add_work add work to queue fail\n");
			goto error;
		}
	} else { /* need to be delayed */
		k_work_init_delayable(&(new_job->work.delay_work), work_handler);
		ret = k_work_schedule_for_queue(&worker_work_q, &(new_job->work.delay_work),
						K_MSEC(job->delay_ms));
		if (ret != 1) { /* queued fail */
			printk("add_work add work to queue fail\n");
			goto error;
		}
	}
	work_count++;
	k_mutex_unlock(&mutex_use_count);
	return ret;

error:
	free(new_job);
	k_mutex_unlock(&mutex_use_count);
	return ret;
}