kernel: update k_thread_state_str() API

When threads are in more than one state at a time, k_thread_state_str()
returns a string that lists each of its states delimited by a '+'.
This in turn necessitates a change to the API that includes both a
pointer to the buffer to use for the string and the size of the buffer.

Signed-off-by: Peter Mitsis <peter.mitsis@intel.com>
This commit is contained in:
Peter Mitsis 2022-04-11 19:54:23 -04:00 committed by Anas Nashif
commit a30cf39975
6 changed files with 103 additions and 43 deletions

View file

@ -103,9 +103,12 @@ void wakeup_src_thread(int id)
*/
for (int i = 0; i < NUM_THREADS; i++) {
k_tid_t th = &worker_threads[i];
char buffer[16];
const char *str;
zassert_equal(strcmp(k_thread_state_str(th), "pending"),
0, "worker thread %d not pending?", i);
str = k_thread_state_str(th, buffer, sizeof(buffer));
zassert_not_null(strstr(str, "pending"),
"worker thread %d not pending?", i);
}
/* Wake the src worker up */

View file

@ -219,32 +219,50 @@ void test_k_thread_foreach_unlocked_null_cb(void)
*/
void test_k_thread_state_str(void)
{
char state_str[32];
const char *str;
k_tid_t tid = &tdata1;
tid->base.thread_state = 0;
zassert_true(strcmp(k_thread_state_str(tid), "") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "") == 0, NULL);
tid->base.thread_state = _THREAD_DUMMY;
zassert_true(strcmp(k_thread_state_str(tid), "dummy") == 0, NULL);
str = k_thread_state_str(tid, NULL, sizeof(state_str));
zassert_true(strcmp(str, "") == 0, NULL);
str = k_thread_state_str(tid, state_str, 0);
zassert_true(strcmp(str, "") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "dummy") == 0, NULL);
tid->base.thread_state = _THREAD_PENDING;
zassert_true(strcmp(k_thread_state_str(tid), "pending") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "pending") == 0, NULL);
tid->base.thread_state = _THREAD_PRESTART;
zassert_true(strcmp(k_thread_state_str(tid), "prestart") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "prestart") == 0, NULL);
tid->base.thread_state = _THREAD_DEAD;
zassert_true(strcmp(k_thread_state_str(tid), "dead") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "dead") == 0, NULL);
tid->base.thread_state = _THREAD_SUSPENDED;
zassert_true(strcmp(k_thread_state_str(tid), "suspended") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "suspended") == 0, NULL);
tid->base.thread_state = _THREAD_ABORTING;
zassert_true(strcmp(k_thread_state_str(tid), "aborting") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "aborting") == 0, NULL);
tid->base.thread_state = _THREAD_QUEUED;
zassert_true(strcmp(k_thread_state_str(tid), "queued") == 0, NULL);
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "queued") == 0, NULL);
tid->base.thread_state = 0xFF;
zassert_true(strcmp(k_thread_state_str(tid), "unknown") == 0, NULL);
tid->base.thread_state = _THREAD_PENDING | _THREAD_SUSPENDED;
str = k_thread_state_str(tid, state_str, sizeof(state_str));
zassert_true(strcmp(str, "pending+suspended") == 0, NULL);
}

View file

@ -156,20 +156,28 @@ void test_threads_suspend_timeout(void)
*/
void test_resume_unsuspend_thread(void)
{
char buffer[32];
const char *str;
k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
thread_entry, NULL, NULL, NULL,
0, K_USER, K_NO_WAIT);
/* Resume an unsuspend thread will not change the thread state. */
zassert_true(strcmp(k_thread_state_str(tid), "queued") == 0, NULL);
str = k_thread_state_str(tid, buffer, sizeof(buffer));
zassert_true(strcmp(str, "queued") == 0, NULL);
k_thread_resume(tid);
zassert_true(strcmp(k_thread_state_str(tid), "queued") == 0, NULL);
str = k_thread_state_str(tid, buffer, sizeof(buffer));
zassert_true(strcmp(str, "queued") == 0, NULL);
/* suspend created thread */
k_thread_suspend(tid);
zassert_true(strcmp(k_thread_state_str(tid), "suspended") == 0, NULL);
str = k_thread_state_str(tid, buffer, sizeof(buffer));
zassert_true(strcmp(str, "suspended") == 0, NULL);
/* Resume an suspend thread will make it to be next eligible.*/
k_thread_resume(tid);
zassert_true(strcmp(k_thread_state_str(tid), "queued") == 0, NULL);
str = k_thread_state_str(tid, buffer, sizeof(buffer));
zassert_true(strcmp(str, "queued") == 0, NULL);
k_thread_abort(tid);
}