#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
// ----------------------------------------------------------------------------
public:
AtomicTestCase() { }
-private:
-
enum ETestType
{
IncAndDecMixed,
DecOnly
};
+private:
class MyThread : public wxThread
{
public:
CPPUNIT_TEST_SUITE( AtomicTestCase );
CPPUNIT_TEST( TestNoThread );
+ CPPUNIT_TEST( TestDecReturn );
CPPUNIT_TEST( TestTwoThreadsMix );
CPPUNIT_TEST( TestTenThreadsMix );
CPPUNIT_TEST( TestTwoThreadsSeparate );
CPPUNIT_TEST_SUITE_END();
void TestNoThread();
+ void TestDecReturn();
void TestTenThreadsMix() { TestWithThreads(10, IncAndDecMixed); }
void TestTwoThreadsMix() { TestWithThreads(2, IncAndDecMixed); }
void TestTenThreadsSeparate() { TestWithThreads(10, IncOnly); }
// 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)
{
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);
}