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;
}