void deAtomic_selfTest (void) { /* Single-threaded tests. */ { volatile int a = 11; DE_TEST_ASSERT(deAtomicIncrement32(&a) == 12); DE_TEST_ASSERT(a == 12); DE_TEST_ASSERT(deAtomicIncrement32(&a) == 13); DE_TEST_ASSERT(a == 13); DE_TEST_ASSERT(deAtomicDecrement32(&a) == 12); DE_TEST_ASSERT(a == 12); DE_TEST_ASSERT(deAtomicDecrement32(&a) == 11); DE_TEST_ASSERT(a == 11); } { volatile deUint32 p; p = 0; DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 0, 1) == 0); DE_TEST_ASSERT(p == 1); DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 0, 2) == 1); DE_TEST_ASSERT(p == 1); p = 7; DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 6, 8) == 7); DE_TEST_ASSERT(p == 7); DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 7, 8) == 7); DE_TEST_ASSERT(p == 8); } /* \todo [2012-10-26 pyry] Implement multi-threaded tests. */ }
void deAtomic_selfTest (void) { /* Single-threaded tests. */ { volatile deInt32 a = 11; DE_TEST_ASSERT(deAtomicIncrementInt32(&a) == 12); DE_TEST_ASSERT(a == 12); DE_TEST_ASSERT(deAtomicIncrementInt32(&a) == 13); DE_TEST_ASSERT(a == 13); a = -2; DE_TEST_ASSERT(deAtomicIncrementInt32(&a) == -1); DE_TEST_ASSERT(a == -1); DE_TEST_ASSERT(deAtomicIncrementInt32(&a) == 0); DE_TEST_ASSERT(a == 0); a = 11; DE_TEST_ASSERT(deAtomicDecrementInt32(&a) == 10); DE_TEST_ASSERT(a == 10); DE_TEST_ASSERT(deAtomicDecrementInt32(&a) == 9); DE_TEST_ASSERT(a == 9); a = 0; DE_TEST_ASSERT(deAtomicDecrementInt32(&a) == -1); DE_TEST_ASSERT(a == -1); DE_TEST_ASSERT(deAtomicDecrementInt32(&a) == -2); DE_TEST_ASSERT(a == -2); a = 0x7fffffff; DE_TEST_ASSERT(deAtomicIncrementInt32(&a) == (int)0x80000000); DE_TEST_ASSERT(a == (int)0x80000000); DE_TEST_ASSERT(deAtomicDecrementInt32(&a) == (int)0x7fffffff); DE_TEST_ASSERT(a == 0x7fffffff); } { volatile deUint32 a = 11; DE_TEST_ASSERT(deAtomicIncrementUint32(&a) == 12); DE_TEST_ASSERT(a == 12); DE_TEST_ASSERT(deAtomicIncrementUint32(&a) == 13); DE_TEST_ASSERT(a == 13); a = 0x7fffffff; DE_TEST_ASSERT(deAtomicIncrementUint32(&a) == 0x80000000); DE_TEST_ASSERT(a == 0x80000000); DE_TEST_ASSERT(deAtomicDecrementUint32(&a) == 0x7fffffff); DE_TEST_ASSERT(a == 0x7fffffff); a = 0xfffffffe; DE_TEST_ASSERT(deAtomicIncrementUint32(&a) == 0xffffffff); DE_TEST_ASSERT(a == 0xffffffff); DE_TEST_ASSERT(deAtomicDecrementUint32(&a) == 0xfffffffe); DE_TEST_ASSERT(a == 0xfffffffe); } { volatile deUint32 p; p = 0; DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 0, 1) == 0); DE_TEST_ASSERT(p == 1); DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 0, 2) == 1); DE_TEST_ASSERT(p == 1); p = 7; DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 6, 8) == 7); DE_TEST_ASSERT(p == 7); DE_TEST_ASSERT(deAtomicCompareExchange32(&p, 7, 8) == 7); DE_TEST_ASSERT(p == 8); } #if (DE_PTR_SIZE == 8) { volatile deInt64 a = 11; DE_TEST_ASSERT(deAtomicIncrementInt64(&a) == 12); DE_TEST_ASSERT(a == 12); DE_TEST_ASSERT(deAtomicIncrementInt64(&a) == 13); DE_TEST_ASSERT(a == 13); a = -2; DE_TEST_ASSERT(deAtomicIncrementInt64(&a) == -1); DE_TEST_ASSERT(a == -1); DE_TEST_ASSERT(deAtomicIncrementInt64(&a) == 0); DE_TEST_ASSERT(a == 0); a = 11; DE_TEST_ASSERT(deAtomicDecrementInt64(&a) == 10); DE_TEST_ASSERT(a == 10); DE_TEST_ASSERT(deAtomicDecrementInt64(&a) == 9); DE_TEST_ASSERT(a == 9); a = 0; DE_TEST_ASSERT(deAtomicDecrementInt64(&a) == -1); DE_TEST_ASSERT(a == -1); DE_TEST_ASSERT(deAtomicDecrementInt64(&a) == -2); DE_TEST_ASSERT(a == -2); a = (deInt64)((1ull << 63) - 1ull); DE_TEST_ASSERT(deAtomicIncrementInt64(&a) == (deInt64)(1ull << 63)); DE_TEST_ASSERT(a == (deInt64)(1ull << 63)); DE_TEST_ASSERT(deAtomicDecrementInt64(&a) == (deInt64)((1ull << 63) - 1)); DE_TEST_ASSERT(a == (deInt64)((1ull << 63) - 1)); } #endif /* (DE_PTR_SIZE == 8) */ /* \todo [2012-10-26 pyry] Implement multi-threaded tests. */ }