rz_core_task_join: Return true on join (#4474)

This commit is contained in:
Khairul Azhar Kasmiran 2024-05-06 21:10:43 +08:00 committed by GitHub
parent 57f1070726
commit 2efd34a305
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 9 deletions

View file

@ -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) {

View file

@ -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);

View file

@ -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");