kernel: allow threads to sleep forever
Previously, passing K_FOREVER to k_sleep() would return immediately. Forever is a long time. Even if woken up at some point, we still had forever to sleep, so return K_FOREVER in this case. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
1c97851726
commit
d2b8922fa3
2 changed files with 40 additions and 2 deletions
|
@ -975,6 +975,11 @@ s32_t z_impl_k_sleep(int ms)
|
|||
{
|
||||
s32_t ticks;
|
||||
|
||||
if (ms == K_FOREVER) {
|
||||
k_thread_suspend(_current);
|
||||
return K_FOREVER;
|
||||
}
|
||||
|
||||
ticks = k_ms_to_ticks_ceil32(ms);
|
||||
ticks = z_tick_sleep(ticks);
|
||||
return k_ticks_to_ms_floor64(ticks);
|
||||
|
@ -1012,8 +1017,11 @@ void z_impl_k_wakeup(k_tid_t thread)
|
|||
}
|
||||
|
||||
if (z_abort_thread_timeout(thread) < 0) {
|
||||
/* Might have just been sleeping forever */
|
||||
if (thread->base.thread_state != _THREAD_SUSPENDED) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
z_mark_thread_as_not_suspended(thread);
|
||||
z_ready_thread(thread);
|
||||
|
|
|
@ -235,11 +235,41 @@ void test_sleep(void)
|
|||
|
||||
extern void test_usleep(void);
|
||||
|
||||
static void forever_thread_entry(void *p1, void *p2, void *p3)
|
||||
{
|
||||
s32_t ret;
|
||||
|
||||
ret = k_sleep(K_FOREVER);
|
||||
zassert_equal(ret, K_FOREVER, "unexpected return value");
|
||||
k_sem_give(&test_thread_sem);
|
||||
}
|
||||
|
||||
void test_sleep_forever(void)
|
||||
{
|
||||
test_objects_init();
|
||||
|
||||
test_thread_id = k_thread_create(&test_thread_data,
|
||||
test_thread_stack,
|
||||
THREAD_STACK,
|
||||
forever_thread_entry,
|
||||
0, 0, NULL, TEST_THREAD_PRIORITY,
|
||||
K_USER | K_INHERIT_PERMS, K_NO_WAIT);
|
||||
|
||||
/* Allow forever thread to run */
|
||||
k_yield();
|
||||
|
||||
k_wakeup(test_thread_id);
|
||||
k_sem_take(&test_thread_sem, K_FOREVER);
|
||||
}
|
||||
|
||||
/*test case main entry*/
|
||||
void test_main(void)
|
||||
{
|
||||
k_thread_access_grant(k_current_get(), &test_thread_sem);
|
||||
|
||||
ztest_test_suite(sleep,
|
||||
ztest_1cpu_unit_test(test_sleep),
|
||||
ztest_1cpu_user_unit_test(test_usleep));
|
||||
ztest_1cpu_user_unit_test(test_usleep),
|
||||
ztest_1cpu_unit_test(test_sleep_forever));
|
||||
ztest_run_test_suite(sleep);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue