]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/thread/atomic.cpp
Add wx/meta/removeref.h header defining wxRemoveRef<> helper.
[wxWidgets.git] / tests / thread / atomic.cpp
index d49019c6abd56717a142cac3c4345e0b0cd61a18..913aabf300cd2475724a0b327eff9dacb0e077e9 100644 (file)
 #include "wx/atomic.h"
 #include "wx/thread.h"
 #include "wx/dynarray.h"
+#include "wx/log.h"
+
 WX_DEFINE_ARRAY_PTR(wxThread *, wxArrayThread);
 
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// number of times to run the loops: the code takes too long to run if we use
+// the bigger value with generic atomic operations implementation
+#ifdef wxHAS_ATOMIC_OPS
+    static const wxInt32 ITERATIONS_NUM = 10000000;
+#else
+    static const wxInt32 ITERATIONS_NUM = 1000;
+#endif
+
 // ----------------------------------------------------------------------------
 // test class
 // ----------------------------------------------------------------------------
@@ -34,8 +48,6 @@ class AtomicTestCase : public CppUnit::TestCase
 public:
     AtomicTestCase() { }
 
-private:
-
     enum ETestType
     {
         IncAndDecMixed,
@@ -43,6 +55,7 @@ private:
         DecOnly
     };
 
+private:
     class MyThread : public wxThread
     {
     public:
@@ -59,6 +72,7 @@ private:
 
     CPPUNIT_TEST_SUITE( AtomicTestCase );
         CPPUNIT_TEST( TestNoThread );
+        CPPUNIT_TEST( TestDecReturn );
         CPPUNIT_TEST( TestTwoThreadsMix );
         CPPUNIT_TEST( TestTenThreadsMix );
         CPPUNIT_TEST( TestTwoThreadsSeparate );
@@ -66,6 +80,7 @@ private:
     CPPUNIT_TEST_SUITE_END();
 
     void TestNoThread();
+    void TestDecReturn();
     void TestTenThreadsMix() { TestWithThreads(10, IncAndDecMixed); }
     void TestTwoThreadsMix() { TestWithThreads(2, IncAndDecMixed); }
     void TestTenThreadsSeparate() { TestWithThreads(10, IncOnly); }
@@ -78,21 +93,33 @@ private:
 // register in the unnamed registry so that these tests are run by default
 CPPUNIT_TEST_SUITE_REGISTRATION( AtomicTestCase );
 
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( AtomicTestCase, "AtomicTestCase" );
 
 void AtomicTestCase::TestNoThread()
 {
-    wxAtomicInt    int1=0, int2=0;
+    wxAtomicInt int1 = 0,
+                int2 = 0;
 
-    for (wxInt32 i=0; i<10000000; ++i)
+    for ( wxInt32 i = 0; i < ITERATIONS_NUM; ++i )
     {
         wxAtomicInc(int1);
         wxAtomicDec(int2);
     }
 
-    CPPUNIT_ASSERT( int1 == 10000000 );
-    CPPUNIT_ASSERT( int2 == -10000000 );
+    CPPUNIT_ASSERT( int1 == ITERATIONS_NUM );
+    CPPUNIT_ASSERT( int2 == -ITERATIONS_NUM );
+}
+
+void AtomicTestCase::TestDecReturn()
+{
+    wxAtomicInt i(0);
+    wxAtomicInc(i);
+    wxAtomicInc(i);
+    CPPUNIT_ASSERT( i == 2 );
+
+    CPPUNIT_ASSERT( wxAtomicDec(i) > 0 );
+    CPPUNIT_ASSERT( wxAtomicDec(i) == 0 );
 }
 
 void AtomicTestCase::TestWithThreads(int count, ETestType testType)
@@ -146,27 +173,27 @@ void *AtomicTestCase::MyThread::Entry()
 {
     wxInt32 negativeValuesSeen = 0;
 
-    for (wxInt32 i=0; i<10000000; ++i)
+    for ( wxInt32 i = 0; i < ITERATIONS_NUM; ++i )
     {
-        switch (m_testType)
+        switch ( m_testType )
         {
-        case AtomicTestCase::IncAndDecMixed:
-            wxAtomicInc(m_operateOn);
-            wxAtomicDec(m_operateOn);
+            case AtomicTestCase::IncAndDecMixed:
+                wxAtomicInc(m_operateOn);
+                wxAtomicDec(m_operateOn);
 
-            if (m_operateOn < 0)
-                ++negativeValuesSeen;
-            break;
+                if (m_operateOn < 0)
+                    ++negativeValuesSeen;
+                break;
 
-        case AtomicTestCase::IncOnly:
-            wxAtomicInc(m_operateOn);
-            break;
+            case AtomicTestCase::IncOnly:
+                wxAtomicInc(m_operateOn);
+                break;
 
-        case AtomicTestCase::DecOnly:
-            wxAtomicDec(m_operateOn);
-            break;
+            case AtomicTestCase::DecOnly:
+                wxAtomicDec(m_operateOn);
+                break;
         }
     }
 
-    return (wxThread::ExitCode)negativeValuesSeen;
+    return wxUIntToPtr(negativeValuesSeen);
 }