From: Andy Heninger Date: Fri, 23 Mar 2018 22:51:39 +0000 (+0000) Subject: ICU-13660 add atomic_inc & dec tests. X-Git-Tag: release-62-rc~209 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc3a13b4595c810b1546c1eed5439db026f693d6;p=icu ICU-13660 add atomic_inc & dec tests. X-SVN-Rev: 41148 --- diff --git a/icu4c/source/test/intltest/tsmthred.cpp b/icu4c/source/test/intltest/tsmthred.cpp index 1a717e3dc03..d0d7a1e475d 100644 --- a/icu4c/source/test/intltest/tsmthred.cpp +++ b/icu4c/source/test/intltest/tsmthred.cpp @@ -45,6 +45,7 @@ MultithreadTest::~MultithreadTest() #include #include #include // tolower, toupper +#include #include "unicode/putil.h" @@ -62,82 +63,24 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) { if (exec) logln("TestSuite MultithreadTest: "); - switch (index) { - case 0: - name = "TestThreads"; - if (exec) - TestThreads(); - break; - - case 1: - name = "TestMutex"; - if (exec) - TestMutex(); - break; - - case 2: - name = "TestThreadedIntl"; + + TESTCASE_AUTO_BEGIN; + TESTCASE_AUTO(TestThreads); + TESTCASE_AUTO(TestMutex); #if !UCONFIG_NO_FORMATTING - if (exec) { - TestThreadedIntl(); - } + TESTCASE_AUTO(TestThreadedIntl); #endif - break; - - case 3: - name = "TestCollators"; #if !UCONFIG_NO_COLLATION - if (exec) { - TestCollators(); - } + TESTCASE_AUTO(TestCollators); #endif /* #if !UCONFIG_NO_COLLATION */ - break; - - case 4: - name = "TestString"; - if (exec) { - TestString(); - } - break; - - case 5: - name = "TestArabicShapingThreads"; - if (exec) { - TestArabicShapingThreads(); - } - break; - - case 6: - name = "TestAnyTranslit"; - if (exec) { - TestAnyTranslit(); - } - break; - - case 7: - name = "TestConditionVariables"; - if (exec) { - TestConditionVariables(); - } - break; - case 8: - name = "TestUnifiedCache"; - if (exec) { - TestUnifiedCache(); - } - break; -#if !UCONFIG_NO_TRANSLITERATION - case 9: - name = "TestBreakTranslit"; - if (exec) { - TestBreakTranslit(); - } - break; -#endif - default: - name = ""; - break; //needed to end loop - } + TESTCASE_AUTO(TestString); + TESTCASE_AUTO(TestArabicShapingThreads); + TESTCASE_AUTO(TestAnyTranslit); + TESTCASE_AUTO(TestConditionVariables); + TESTCASE_AUTO(TestUnifiedCache); + TESTCASE_AUTO(TestBreakTranslit); + TESTCASE_AUTO(TestIncDec); + TESTCASE_AUTO_END } @@ -1572,4 +1515,36 @@ void MultithreadTest::TestBreakTranslit() { gTranslitExpected = NULL; } + +class TestIncDecThread : public SimpleThread { +public: + TestIncDecThread() { }; + virtual void run(); +}; + +static u_atomic_int32_t gIncDecCounter; + +void TestIncDecThread::run() { + umtx_atomic_inc(&gIncDecCounter); + for (int32_t i=0; i<5000000; ++i) { + umtx_atomic_inc(&gIncDecCounter); + umtx_atomic_dec(&gIncDecCounter); + } +} + +void MultithreadTest::TestIncDec() +{ + static constexpr int NUM_THREADS = 4; + gIncDecCounter = 0; + TestIncDecThread threads[NUM_THREADS]; + for (auto &thread:threads) { + thread.start(); + } + for (auto &thread:threads) { + thread.join(); + } + assertEquals("TestIncDec", NUM_THREADS, gIncDecCounter); +} + + #endif /* !UCONFIG_NO_TRANSLITERATION */ diff --git a/icu4c/source/test/intltest/tsmthred.h b/icu4c/source/test/intltest/tsmthred.h index 6ed24d7635c..b2517e22203 100644 --- a/icu4c/source/test/intltest/tsmthred.h +++ b/icu4c/source/test/intltest/tsmthred.h @@ -52,7 +52,7 @@ public: void TestConditionVariables(); void TestUnifiedCache(); void TestBreakTranslit(); - + void TestIncDec(); }; #endif