X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest%2Ftest_lcores.c;h=a0d8c6aa41dd02513644153c21db49b820293a83;hb=f684672947d68b3b5d1def9c6a30eb3125b62f70;hp=19a7ab9fceb1acc08c09254e32376a353e65b44d;hpb=b41befd3af2aaa486a04f79138bea22f43bf5f3c;p=dpdk.git diff --git a/app/test/test_lcores.c b/app/test/test_lcores.c index 19a7ab9fce..a0d8c6aa41 100644 --- a/app/test/test_lcores.c +++ b/app/test/test_lcores.c @@ -12,7 +12,7 @@ #include "test.h" struct thread_context { - enum { INIT, ERROR, DONE } state; + enum { Thread_INIT, Thread_ERROR, Thread_DONE } state; bool lcore_id_any; pthread_t id; unsigned int *registered_count; @@ -26,7 +26,7 @@ static void *thread_loop(void *arg) lcore_id = rte_lcore_id(); if (lcore_id != LCORE_ID_ANY) { printf("Error: incorrect lcore id for new thread %u\n", lcore_id); - t->state = ERROR; + t->state = Thread_ERROR; } if (rte_thread_register() < 0) printf("Warning: could not register new thread (this might be expected during this test), reason %s\n", @@ -36,7 +36,7 @@ static void *thread_loop(void *arg) (!t->lcore_id_any && lcore_id == LCORE_ID_ANY)) { printf("Error: could not register new thread, got %u while %sexpecting %u\n", lcore_id, t->lcore_id_any ? "" : "not ", LCORE_ID_ANY); - t->state = ERROR; + t->state = Thread_ERROR; } /* Report register happened to the control thread. */ __atomic_add_fetch(t->registered_count, 1, __ATOMIC_RELEASE); @@ -49,11 +49,11 @@ static void *thread_loop(void *arg) if (lcore_id != LCORE_ID_ANY) { printf("Error: could not unregister new thread, %u still assigned\n", lcore_id); - t->state = ERROR; + t->state = Thread_ERROR; } - if (t->state != ERROR) - t->state = DONE; + if (t->state != Thread_ERROR) + t->state = Thread_DONE; return NULL; } @@ -74,7 +74,7 @@ test_non_eal_lcores(unsigned int eal_threads_count) /* Try to create as many threads as possible. */ for (i = 0; i < RTE_MAX_LCORE - eal_threads_count; i++) { t = &thread_contexts[i]; - t->state = INIT; + t->state = Thread_INIT; t->registered_count = ®istered_count; t->lcore_id_any = false; if (pthread_create(&t->id, NULL, thread_loop, t) != 0) @@ -93,7 +93,7 @@ test_non_eal_lcores(unsigned int eal_threads_count) if (eal_threads_count + non_eal_threads_count < RTE_MAX_LCORE) goto skip_lcore_any; t = &thread_contexts[non_eal_threads_count]; - t->state = INIT; + t->state = Thread_INIT; t->registered_count = ®istered_count; t->lcore_id_any = true; if (pthread_create(&t->id, NULL, thread_loop, t) == 0) { @@ -111,7 +111,7 @@ skip_lcore_any: for (i = 0; i < non_eal_threads_count; i++) { t = &thread_contexts[i]; pthread_join(t->id, NULL); - if (t->state != DONE) + if (t->state != Thread_DONE) ret = -1; } @@ -259,7 +259,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count) } /* First thread that expects a valid lcore id. */ t = &thread_contexts[0]; - t->state = INIT; + t->state = Thread_INIT; t->registered_count = ®istered_count; t->lcore_id_any = false; if (pthread_create(&t->id, NULL, thread_loop, t) != 0) @@ -282,7 +282,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count) } /* Second thread, that expects LCORE_ID_ANY because of init refusal. */ t = &thread_contexts[1]; - t->state = INIT; + t->state = Thread_INIT; t->registered_count = ®istered_count; t->lcore_id_any = true; if (pthread_create(&t->id, NULL, thread_loop, t) != 0) @@ -310,7 +310,7 @@ test_non_eal_lcores_callback(unsigned int eal_threads_count) for (i = 0; i < non_eal_threads_count; i++) { t = &thread_contexts[i]; pthread_join(t->id, NULL); - if (t->state != DONE) + if (t->state != Thread_DONE) ret = -1; } if (ret < 0) @@ -340,6 +340,44 @@ error: return -1; } +static void *ctrl_thread_loop(void *arg) +{ + struct thread_context *t = arg; + + printf("Control thread running successfully\n"); + + /* Set the thread state to DONE */ + t->state = Thread_DONE; + + return NULL; +} + +static int +test_ctrl_thread(void) +{ + struct thread_context ctrl_thread_context; + struct thread_context *t; + + /* Create one control thread */ + t = &ctrl_thread_context; + t->state = Thread_INIT; + if (rte_ctrl_thread_create(&t->id, "test_ctrl_threads", + NULL, ctrl_thread_loop, t) != 0) + return -1; + + /* Wait till the control thread exits. + * This also acts as the barrier such that the memory operations + * in control thread are visible to this thread. + */ + pthread_join(t->id, NULL); + + /* Check if the control thread set the correct state */ + if (t->state != Thread_DONE) + return -1; + + return 0; +} + static int test_lcores(void) { @@ -367,6 +405,9 @@ test_lcores(void) if (test_non_eal_lcores_callback(eal_threads_count) < 0) return TEST_FAILED; + if (test_ctrl_thread() < 0) + return TEST_FAILED; + return TEST_SUCCESS; }