Skip to content

Commit

Permalink
rz_core_task_join: Return fine-grained error values (#4505)
Browse files Browse the repository at this point in the history
  • Loading branch information
kazarmy committed May 22, 2024
1 parent c7464ab commit 84e63af
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
12 changes: 6 additions & 6 deletions librz/core/task.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,21 +94,21 @@ static bool task_join(RzCoreTask *task) {
return true;
}

RZ_API bool rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id) {
bool ret = true;
RZ_API RzCoreTaskJoinErr rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id) {
RzCoreTaskJoinErr ret = RZ_CORE_TASK_JOIN_ERR_SUCCESS;
if (current && id == current->id) {
return false;
return RZ_CORE_TASK_JOIN_ERR_CURRENT;
}
if (id >= 0) {
RzCoreTask *task = rz_core_task_get_incref(scheduler, id);
if (!task) {
return false;
return RZ_CORE_TASK_JOIN_ERR_NO_TASK;
}
if (current) {
rz_core_task_sleep_begin(current);
}
if (!task_join(task)) {
ret = false;
ret = RZ_CORE_TASK_JOIN_ERR_ONE_NO_SEM;
}
if (current) {
rz_core_task_sleep_end(current);
Expand Down Expand Up @@ -136,7 +136,7 @@ RZ_API bool rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *curren
rz_core_task_sleep_begin(current);
}
if (!task_join(task)) {
ret = false;
ret = RZ_CORE_TASK_JOIN_ERR_ALL_NO_SEM;
}
if (current) {
rz_core_task_sleep_end(current);
Expand Down
10 changes: 9 additions & 1 deletion librz/include/rz_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -1138,6 +1138,14 @@ typedef enum {
RZ_CORE_TASK_STATE_DONE
} RzTaskState;

typedef enum {
RZ_CORE_TASK_JOIN_ERR_SUCCESS = 0, ///< Join success!
RZ_CORE_TASK_JOIN_ERR_CURRENT, ///< Join on current task
RZ_CORE_TASK_JOIN_ERR_NO_TASK, ///< No task has given id
RZ_CORE_TASK_JOIN_ERR_ONE_NO_SEM, ///< No join semaphore when joining on one task
RZ_CORE_TASK_JOIN_ERR_ALL_NO_SEM ///< No join semaphore when joining on all tasks
} RzCoreTaskJoinErr;

/**
* Main payload of a task, the function that should be executed asynchronously.
*/
Expand Down Expand Up @@ -1191,7 +1199,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 bool rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id);
RZ_API RzCoreTaskJoinErr 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);
Expand Down
4 changes: 2 additions & 2 deletions test/unit/test_core_task.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +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);

bool task_joined = rz_core_task_join(&core->tasks, rz_core_task_self(&core->tasks), a->id);
mu_assert_true(task_joined, "task joined");
RzCoreTaskJoinErr join_err = rz_core_task_join(&core->tasks, rz_core_task_self(&core->tasks), a->id);
mu_assert_eq(join_err, RZ_CORE_TASK_JOIN_ERR_SUCCESS, "task joined");

const char *cmd_result = rz_core_cmd_task_get_result(a);
mu_assert_streq(cmd_result, "amor\nvincit\nomnia\n", "cmd result");
Expand Down

0 comments on commit 84e63af

Please sign in to comment.