diff options
author | Wealian Liao <whliao@nuvoton.corp-partner.google.com> | 2021-03-08 14:47:59 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-03-10 03:53:34 +0000 |
commit | 819adb4fa98f5d32a373ebd63e668b1c1bc5b121 (patch) | |
tree | db3a05edc92e98757ebde2570b7e4577040bdc19 | |
parent | 43fe3569949f74ece62d6a82829355c39a010d65 (diff) | |
download | chrome-ec-819adb4fa98f5d32a373ebd63e668b1c1bc5b121.tar.gz |
zephyr: add defer canceling
For the description of hook_call_deferred() in hooks.h, pass delay time
-1 to hook_call_deferred() should cancel the deferred call. Add
canceling to sync the original behavior in shim hook.
BRANCH=none
BUG=none
TEST=zmake testall
TEST=check defer is canceled by ` -1 ` parameter.
Signed-off-by: Wealian Liao <whliao@nuvoton.corp-partner.google.com>
Change-Id: I3e9743d5c19efbc8619fd5cbd61ff247db700af9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2738912
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
-rw-r--r-- | zephyr/shim/src/hooks.c | 21 | ||||
-rw-r--r-- | zephyr/test/hooks/hooks.c | 24 |
2 files changed, 37 insertions, 8 deletions
diff --git a/zephyr/shim/src/hooks.c b/zephyr/shim/src/hooks.c index 179f35eef4..dee7c20441 100644 --- a/zephyr/shim/src/hooks.c +++ b/zephyr/shim/src/hooks.c @@ -55,13 +55,21 @@ void zephyr_shim_setup_deferred(const struct deferred_data *data) int hook_call_deferred(const struct deferred_data *data, int us) { struct deferred_data *non_const = (struct deferred_data *)data; - int rv; + int rv = 0; + + if (us == -1) { + k_delayed_work_cancel(&non_const->delayed_work); + } else if (us >= 0) { + rv = k_delayed_work_submit_to_queue(&deferred_work_queue, + &non_const->delayed_work, + K_USEC(us)); + if (rv < 0) + cprints(CC_HOOK, + "Warning: deferred call not submitted."); + } else { + return EC_ERROR_PARAM2; + } - rv = k_delayed_work_submit_to_queue(&deferred_work_queue, - &non_const->delayed_work, - K_USEC(us)); - if (rv < 0) - cprints(CC_HOOK, "Warning: deferred call not submitted."); return rv; } @@ -126,4 +134,3 @@ void hook_task(void *u) task_wait_event(next); } } - diff --git a/zephyr/test/hooks/hooks.c b/zephyr/test/hooks/hooks.c index 6b482b30cf..9f504d4ff4 100644 --- a/zephyr/test/hooks/hooks.c +++ b/zephyr/test/hooks/hooks.c @@ -120,6 +120,27 @@ static void test_deferred_func_push_out(void) "The deferred function was not called, but should have been"); } +static bool deferred_func_3_called; + +static void deferred_func_3(void) +{ + deferred_func_3_called = true; +} +DECLARE_DEFERRED(deferred_func_3); + +static void test_deferred_func_cancel(void) +{ + zassert_false( + deferred_func_3_called, + "The deferred function was called, but should not have been"); + hook_call_deferred(&deferred_func_3_data, DEFERRED_DELAY_US); + hook_call_deferred(&deferred_func_3_data, -1); + k_usleep(DEFERRED_DELAY_US * 2); + zassert_false( + deferred_func_3_called, + "The deferred function was called, but should not have been"); +} + void test_main(void) { ztest_test_suite( @@ -128,7 +149,8 @@ void test_main(void) ztest_unit_test(test_hook_list_single), ztest_unit_test(test_hook_list_empty), ztest_unit_test(test_deferred_func), - ztest_unit_test(test_deferred_func_push_out)); + ztest_unit_test(test_deferred_func_push_out), + ztest_unit_test(test_deferred_func_cancel)); ztest_run_test_suite(hooks_tests); } |