예제 #1
0
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. */
}
예제 #2
0
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. */
}