summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWealian Liao <whliao@nuvoton.corp-partner.google.com>2021-03-08 14:47:59 +0800
committerCommit Bot <commit-bot@chromium.org>2021-03-10 03:53:34 +0000
commit819adb4fa98f5d32a373ebd63e668b1c1bc5b121 (patch)
treedb3a05edc92e98757ebde2570b7e4577040bdc19
parent43fe3569949f74ece62d6a82829355c39a010d65 (diff)
downloadchrome-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.c21
-rw-r--r--zephyr/test/hooks/hooks.c24
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);
}