diff --git a/librz/core/task.c b/librz/core/task.c index cd91025c1f..f42adb2546 100644 --- a/librz/core/task.c +++ b/librz/core/task.c @@ -83,29 +83,33 @@ RZ_API int rz_core_task_running_tasks_count(RzCoreTaskScheduler *scheduler) { return count; } -static void task_join(RzCoreTask *task) { +static bool task_join(RzCoreTask *task) { RzThreadSemaphore *sem = task->running_sem; if (!sem) { - return; + return false; } rz_th_sem_wait(sem); rz_th_sem_post(sem); + return true; } -RZ_API void rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id) { +RZ_API bool rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id) { + bool ret = true; if (current && id == current->id) { - return; + return false; } if (id >= 0) { RzCoreTask *task = rz_core_task_get_incref(scheduler, id); if (!task) { - return; + return false; } if (current) { rz_core_task_sleep_begin(current); } - task_join(task); + if (!task_join(task)) { + ret = false; + } if (current) { rz_core_task_sleep_end(current); } @@ -131,7 +135,9 @@ RZ_API void rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *curren if (current) { rz_core_task_sleep_begin(current); } - task_join(task); + if (!task_join(task)) { + ret = false; + } if (current) { rz_core_task_sleep_end(current); } @@ -139,6 +145,7 @@ RZ_API void rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *curren } rz_list_free(tasks); } + return ret; } static void task_free(RzCoreTask *task) { diff --git a/librz/include/rz_core.h b/librz/include/rz_core.h index 2bed94ef9c..0e43e8deb4 100644 --- a/librz/include/rz_core.h +++ b/librz/include/rz_core.h @@ -1191,7 +1191,7 @@ RZ_API void rz_core_task_break(RzCoreTaskScheduler *scheduler, int id); RZ_API void rz_core_task_break_all(RzCoreTaskScheduler *scheduler); RZ_API int rz_core_task_del(RzCoreTaskScheduler *scheduler, int id); RZ_API RzCoreTask *rz_core_task_self(RzCoreTaskScheduler *scheduler); -RZ_API void rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id); +RZ_API bool rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id); typedef void (*inRangeCb)(RzCore *core, ut64 from, ut64 to, int vsize, void *cb_user); RZ_API int rz_core_search_value_in_range(RzCore *core, RzInterval search_itv, ut64 vmin, ut64 vmax, int vsize, inRangeCb cb, void *cb_user); diff --git a/test/unit/test_core_task.c b/test/unit/test_core_task.c index 46aa246bae..fbc6255ffd 100644 --- a/test/unit/test_core_task.c +++ b/test/unit/test_core_task.c @@ -69,7 +69,8 @@ static bool test_core_task_finished_cb(void) { RzCoreTask *a = rz_core_cmd_task_new(core, "echo amor; echo vincit; echo omnia", finished_cb, &res_indir); rz_core_task_enqueue(&core->tasks, a); - rz_core_task_join(&core->tasks, rz_core_task_self(&core->tasks), a->id); + bool task_joined = rz_core_task_join(&core->tasks, rz_core_task_self(&core->tasks), a->id); + mu_assert_true(task_joined, "task joined"); const char *cmd_result = rz_core_cmd_task_get_result(a); mu_assert_streq(cmd_result, "amor\nvincit\nomnia\n", "cmd result");