From 79ae7a7bd968af1ea6bbf8aa9d0db5bb2739bc73 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Mon, 19 Apr 2021 20:01:24 +1000 Subject: [PATCH] freertos: test: Add stress test for thread local storage (Fails without the fix applied in parent commit.) --- .../pthread/test/test_pthread_local_storage.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/components/pthread/test/test_pthread_local_storage.c b/components/pthread/test/test_pthread_local_storage.c index 114c33b893..ebcaafcbe8 100644 --- a/components/pthread/test/test_pthread_local_storage.c +++ b/components/pthread/test/test_pthread_local_storage.c @@ -4,6 +4,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "test_utils.h" +#include "esp_system.h" TEST_CASE("pthread local storage basics", "[pthread]") { @@ -128,3 +129,36 @@ static void task_test_pthread_destructor(void *v_key) thread_test_pthread_destructor(v_key); vTaskDelete(NULL); } + +#define STRESS_NUMITER 2000000 +#define STRESS_NUMTASKS 16 + +static void *thread_stress_test(void *v_key) +{ + pthread_key_t key = (pthread_key_t) v_key; + void *tls_value = (void *)esp_random(); + + pthread_setspecific(key, tls_value); + + for(int i = 0; i < STRESS_NUMITER; i++) { + TEST_ASSERT_EQUAL_HEX32(pthread_getspecific(key), tls_value); + } + + return NULL; +} + + +// This test case added to reproduce issues with unpinned tasks and TLS +TEST_CASE("pthread local storage stress test", "[pthread]") +{ + pthread_key_t key = -1; + pthread_t threads[STRESS_NUMTASKS] = { 0 }; + TEST_ASSERT_EQUAL(0, pthread_key_create(&key, test_pthread_destructor)); + + for (int i = 0; i < STRESS_NUMTASKS; i++) { + TEST_ASSERT_EQUAL(0, pthread_create(&threads[i], NULL, thread_stress_test, (void *)key)); + } + for (int i = 0; i < STRESS_NUMTASKS; i++) { + TEST_ASSERT_EQUAL(0, pthread_join(threads[i], NULL)); + } +}