diff --git a/.gitignore b/.gitignore index 4b550b45..77faf521 100644 --- a/.gitignore +++ b/.gitignore @@ -258,3 +258,4 @@ build-test-Desktop_x86_windows_msvc2019_pe_32bit-Debug test/vs2019/.vs Corel Auto-Preserve test/vs2019/Debug No Unit Tests +test/kdevelopbuild diff --git a/include/etl/variant_new.h b/include/etl/experimental/variant_new.h similarity index 100% rename from include/etl/variant_new.h rename to include/etl/experimental/variant_new.h diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index caba0ea6..06121a05 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -173,7 +173,13 @@ add_executable(etl_tests if(UNIX AND NOT APPLE) # atomic is need on Linux with Clang - target_link_libraries(etl_tests UnitTest++ atomic) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(etl_tests UnitTest++ atomic Threads::Threads) +elseif(NOT UNIX AND APPLE) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(etl_tests UnitTest++) else() target_link_libraries(etl_tests UnitTest++) endif() diff --git a/test/codeblocks/ETL.cbp b/test/codeblocks/ETL.cbp index 51483503..9d532038 100644 --- a/test/codeblocks/ETL.cbp +++ b/test/codeblocks/ETL.cbp @@ -63,6 +63,7 @@ + @@ -97,6 +98,9 @@ + + + diff --git a/test/test_atomic_gcc_sync.cpp b/test/test_atomic_gcc_sync.cpp index ec6cee80..67ad4e93 100644 --- a/test/test_atomic_gcc_sync.cpp +++ b/test/test_atomic_gcc_sync.cpp @@ -32,6 +32,9 @@ SOFTWARE. #include "etl/atomic/atomic_gcc_sync.h" #include +#include + +#define REALTIME_TEST 1 namespace { @@ -480,5 +483,44 @@ namespace CHECK_EQUAL(compare_expected, test_expected); CHECK_EQUAL(compare.load(), test.load()); } + + //========================================================================= + #if REALTIME_TEST + etl::atomic_int32_t atomic_value = 0U; + etl::atomic atomic_flag = false; + + void thread1() + { + while (!atomic_flag.load()); + + for (int i = 0; i < 10000000; ++i) + { + ++atomic_value; + } + } + + void thread2() + { + while (!atomic_flag.load()); + + for (int i = 0; i < 10000000; ++i) + { + --atomic_value; + } + } + + TEST(test_atomic_multi_thread) + { + std::thread t1(thread1); + std::thread t2(thread2); + + atomic_flag.store(true); + + t1.join(); + t2.join(); + + CHECK_EQUAL(0, atomic_value.load()); + } + #endif }; } diff --git a/test/test_atomic_std.cpp b/test/test_atomic_std.cpp index d34d491d..ea98228b 100644 --- a/test/test_atomic_std.cpp +++ b/test/test_atomic_std.cpp @@ -32,6 +32,13 @@ SOFTWARE. #include "etl/atomic/atomic_std.h" #include +#include + +#if defined(ETL_TARGET_OS_WINDOWS) + #include +#endif + +#define REALTIME_TEST 1 namespace { @@ -480,5 +487,61 @@ namespace CHECK_EQUAL(compare_expected, test_expected); CHECK_EQUAL(compare.load(), test.load()); } + + //========================================================================= +#if REALTIME_TEST + +#if defined(ETL_TARGET_OS_WINDOWS) // Only Windows priority is currently supported + #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) + #define FIX_PROCESSOR_AFFINITY1 SetThreadAffinityMask(GetCurrentThread(), 1) + #define FIX_PROCESSOR_AFFINITY2 SetThreadAffinityMask(GetCurrentThread(), 2) +#else + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY1 + #define FIX_PROCESSOR_AFFINITY2 +#endif + + etl::atomic_int32_t atomic_value = 0U; + etl::atomic start = false; + + void thread1() + { + RAISE_THREAD_PRIORITY; + FIX_PROCESSOR_AFFINITY1; + + while (!start.load()); + + for (int i = 0; i < 10000000; ++i) + { + ++atomic_value; + } + } + + void thread2() + { + RAISE_THREAD_PRIORITY; + FIX_PROCESSOR_AFFINITY2; + + while (!start.load()); + + for (int i = 0; i < 10000000; ++i) + { + --atomic_value; + } + } + + TEST(test_atomic_multi_thread) + { + std::thread t1(thread1); + std::thread t2(thread2); + + start.store(true); + + t1.join(); + t2.join(); + + CHECK_EQUAL(0, atomic_value.load()); + } +#endif }; } diff --git a/test/test_callback_timer.cpp b/test/test_callback_timer.cpp index 7a047e6c..8aeb924b 100644 --- a/test/test_callback_timer.cpp +++ b/test/test_callback_timer.cpp @@ -55,6 +55,7 @@ namespace public: Test() + : p_controller(nullptr) { } @@ -684,7 +685,8 @@ namespace #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) #define FIX_PROCESSOR_AFFINITY SetThreadAffinityMask(GetCurrentThread(), 1); #else - #error No thread priority modifier defined + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY #endif etl::callback_timer<3> controller; diff --git a/test/test_message_timer.cpp b/test/test_message_timer.cpp index a5eb6b1f..064ba063 100644 --- a/test/test_message_timer.cpp +++ b/test/test_message_timer.cpp @@ -601,7 +601,8 @@ namespace #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) #define FIX_PROCESSOR_AFFINITY SetThreadAffinityMask(GetCurrentThread(), 1); #else - #error No thread priority modifier defined + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY #endif etl::message_timer<3> controller; diff --git a/test/test_queue_mpmc_mutex.cpp b/test/test_queue_mpmc_mutex.cpp index 8b48555a..ed7fb3fe 100644 --- a/test/test_queue_mpmc_mutex.cpp +++ b/test/test_queue_mpmc_mutex.cpp @@ -41,7 +41,7 @@ SOFTWARE. #if ETL_HAS_MUTEX -#if defined(ETL_COMPILER_MICROSOFT) +#if defined(ETL_TARGET_OS_WINDOWS) #include #endif diff --git a/test/test_queue_mpmc_mutex_small.cpp b/test/test_queue_mpmc_mutex_small.cpp index 2042841f..01a1d131 100644 --- a/test/test_queue_mpmc_mutex_small.cpp +++ b/test/test_queue_mpmc_mutex_small.cpp @@ -41,7 +41,7 @@ SOFTWARE. #if ETL_HAS_MUTEX -#if defined(ETL_COMPILER_MICROSOFT) +#if defined(ETL_TARGET_OS_WINDOWS) #include #endif diff --git a/test/test_queue_spsc_atomic.cpp b/test/test_queue_spsc_atomic.cpp index 4534487a..f961aa80 100644 --- a/test/test_queue_spsc_atomic.cpp +++ b/test/test_queue_spsc_atomic.cpp @@ -38,7 +38,7 @@ SOFTWARE. #if ETL_HAS_ATOMIC -#if defined(ETL_COMPILER_MICROSOFT) +#if defined(ETL_TARGET_OS_WINDOWS) #include #endif diff --git a/test/test_queue_spsc_atomic_small.cpp b/test/test_queue_spsc_atomic_small.cpp index 1f050c98..4a8ccc1d 100644 --- a/test/test_queue_spsc_atomic_small.cpp +++ b/test/test_queue_spsc_atomic_small.cpp @@ -38,7 +38,7 @@ SOFTWARE. #if ETL_HAS_ATOMIC -#if defined(ETL_COMPILER_MICROSOFT) +#if defined(ETL_TARGET_OS_WINDOWS) #include #endif diff --git a/test/test_queue_spsc_isr.cpp b/test/test_queue_spsc_isr.cpp index 269cf5e0..a3433af4 100644 --- a/test/test_queue_spsc_isr.cpp +++ b/test/test_queue_spsc_isr.cpp @@ -571,12 +571,13 @@ namespace } //************************************************************************* -#if REALTIME_TEST && defined(ETL_COMPILER_MICROSOFT) +#if REALTIME_TEST #if defined(ETL_TARGET_OS_WINDOWS) // Only Windows priority is currently supported #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) #define FIX_PROCESSOR_AFFINITY SetThreadAffinityMask(GetCurrentThread(), 1); #else - #error No thread priority modifier defined + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY #endif size_t ticks = 0; diff --git a/test/test_queue_spsc_isr_small.cpp b/test/test_queue_spsc_isr_small.cpp index 9a8efb5d..0dbc33f3 100644 --- a/test/test_queue_spsc_isr_small.cpp +++ b/test/test_queue_spsc_isr_small.cpp @@ -589,12 +589,13 @@ namespace } //************************************************************************* -#if REALTIME_TEST && defined(ETL_COMPILER_MICROSOFT) +#if REALTIME_TEST #if defined(ETL_TARGET_OS_WINDOWS) // Only Windows priority is currently supported #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) #define FIX_PROCESSOR_AFFINITY SetThreadAffinityMask(GetCurrentThread(), 1); #else - #error No thread priority modifier defined + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY #endif size_t ticks = 0; diff --git a/test/test_queue_spsc_locked.cpp b/test/test_queue_spsc_locked.cpp index ff07d575..c0e14308 100644 --- a/test/test_queue_spsc_locked.cpp +++ b/test/test_queue_spsc_locked.cpp @@ -574,12 +574,13 @@ namespace } //************************************************************************* -#if REALTIME_TEST && defined(ETL_COMPILER_MICROSOFT) +#if REALTIME_TEST #if defined(ETL_TARGET_OS_WINDOWS) // Only Windows priority is currently supported #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) #define FIX_PROCESSOR_AFFINITY SetThreadAffinityMask(GetCurrentThread(), 1); #else - #error No thread priority modifier defined + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY #endif size_t ticks = 0; diff --git a/test/test_queue_spsc_locked_small.cpp b/test/test_queue_spsc_locked_small.cpp index 6f58bd05..b8bdbb94 100644 --- a/test/test_queue_spsc_locked_small.cpp +++ b/test/test_queue_spsc_locked_small.cpp @@ -34,7 +34,7 @@ SOFTWARE. #include #include -#if defined(ETL_COMPILER_MICROSOFT) +#if defined(ETL_TARGET_OS_WINDOWS) #include #endif @@ -591,12 +591,13 @@ namespace } //************************************************************************* -#if REALTIME_TEST && defined(ETL_COMPILER_MICROSOFT) - #if defined(ETL_TARGET_OS_WINDOWS) // Only Windows priority is currently supported +#if REALTIME_TEST +#if defined(ETL_TARGET_OS_WINDOWS) // Only Windows priority is currently supported #define RAISE_THREAD_PRIORITY SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) #define FIX_PROCESSOR_AFFINITY SetThreadAffinityMask(GetCurrentThread(), 1); #else - #error No thread priority modifier defined + #define RAISE_THREAD_PRIORITY + #define FIX_PROCESSOR_AFFINITY #endif size_t ticks = 0;