From 3fe5911dbfd6751dbd9bdb936086224b2e45f586 Mon Sep 17 00:00:00 2001 From: Pawel Wieczorkiewicz Date: Fri, 24 Jun 2022 10:04:22 +0200 Subject: [PATCH] tasks: make tasks functions return unsigned long value Tasks execute functions and now the functions can return a value, which is stored in task structure's result field. Signed-off-by: Pawel Wieczorkiewicz --- common/sched.c | 2 +- drivers/acpi/acpica/osl.c | 18 +++++++++++++++++- include/ktf.h | 2 +- include/sched.h | 2 +- tests/test.c | 3 ++- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/common/sched.c b/common/sched.c index 5bbc0bcc..7e6392e8 100644 --- a/common/sched.c +++ b/common/sched.c @@ -202,7 +202,7 @@ static void run_task(task_t *task) { printk("CPU[%u]: Running task %s[%u]\n", task->cpu, task->name, task->id); set_task_state(task, TASK_STATE_RUNNING); - task->func(task->arg); + task->result = task->func(task->arg); set_task_state(task, TASK_STATE_DONE); } diff --git a/drivers/acpi/acpica/osl.c b/drivers/acpi/acpica/osl.c index 66a74e25..9d372a00 100644 --- a/drivers/acpi/acpica/osl.c +++ b/drivers/acpi/acpica/osl.c @@ -343,16 +343,32 @@ ACPI_THREAD_ID AcpiOsGetThreadId(void) { return smp_processor_id() + 1; } +struct osd_exec_cb_wrapper { + ACPI_OSD_EXEC_CALLBACK Function; + void *Context; +}; +typedef struct osd_exec_cb_wrapper osd_exec_cb_wrapper_t; + +unsigned long _osd_exec_cb_wrapper(void *arg) { + osd_exec_cb_wrapper_t *cb = arg; + + cb->Function(cb->Context); + return 0; +} + ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, void *Context) { static unsigned counter = 0; unsigned cpu = smp_processor_id(); + osd_exec_cb_wrapper_t cb; char name[40]; task_t *task; snprintf(name, sizeof(name), "acpi_%u_%u_%u", Type, counter++, cpu); - task = new_task(name, (task_func_t) Function, Context); + cb.Function = Function; + cb.Context = Context; + task = new_task(name, _osd_exec_cb_wrapper, &cb); if (!task) return AE_NO_MEMORY; diff --git a/include/ktf.h b/include/ktf.h index 44f84188..500cc215 100644 --- a/include/ktf.h +++ b/include/ktf.h @@ -45,7 +45,7 @@ extern bool opt_debug; extern int usermode_call(user_func_t fn, void *fn_arg); extern void kernel_main(void) __noreturn; -extern void test_main(void *unused); +extern unsigned long test_main(void *unused); #endif /* __ASSEMBLY__ */ diff --git a/include/sched.h b/include/sched.h index be808587..004a5880 100644 --- a/include/sched.h +++ b/include/sched.h @@ -30,7 +30,7 @@ #include #include -typedef void (*task_func_t)(void *arg); +typedef unsigned long (*task_func_t)(void *arg); enum task_state { TASK_STATE_NEW, diff --git a/tests/test.c b/tests/test.c index 0ec088d6..31295511 100644 --- a/tests/test.c +++ b/tests/test.c @@ -59,7 +59,7 @@ static get_next_test_result_t get_next_test(test_fn **out_test_fn, char **out_na return TESTS_DONE; } -void test_main(void *unused) { +unsigned long test_main(void *unused) { char *name; test_fn *fn = NULL; unsigned n = 0; @@ -76,4 +76,5 @@ void test_main(void *unused) { } printk("Tests completed: %u\n", n); + return 0; }