#include #include #include #include int TestInterlockedAccess(int argc, char* argv[]) { int index; LONG* Addend; LONG* Target; LONG oldValue; LONG* Destination; LONGLONG oldValue64; LONGLONG* Destination64; /* InterlockedIncrement */ Addend = _aligned_malloc(sizeof(LONG), sizeof(LONG)); if (!Addend) { printf("Failed to allocate memory\n"); return -1; } *Addend = 0; for (index = 0; index < 10; index ++) InterlockedIncrement(Addend); if (*Addend != 10) { printf("InterlockedIncrement failure: Actual: %"PRId32", Expected: 10\n", *Addend); return -1; } /* InterlockedDecrement */ for (index = 0; index < 10; index ++) InterlockedDecrement(Addend); if (*Addend != 0) { printf("InterlockedDecrement failure: Actual: %"PRId32", Expected: 0\n", *Addend); return -1; } /* InterlockedExchange */ Target = _aligned_malloc(sizeof(LONG), sizeof(LONG)); if (!Target) { printf("Failed to allocate memory\n"); return -1; } *Target = 0xAA; oldValue = InterlockedExchange(Target, 0xFF); if (oldValue != 0xAA) { printf("InterlockedExchange failure: Actual: 0x%08"PRIX32", Expected: 0xAA\n", oldValue); return -1; } if (*Target != 0xFF) { printf("InterlockedExchange failure: Actual: 0x%08"PRIX32", Expected: 0xFF\n", *Target); return -1; } /* InterlockedExchangeAdd */ *Addend = 25; oldValue = InterlockedExchangeAdd(Addend, 100); if (oldValue != 25) { printf("InterlockedExchangeAdd failure: Actual: %"PRId32", Expected: 25\n", oldValue); return -1; } if (*Addend != 125) { printf("InterlockedExchangeAdd failure: Actual: %"PRId32", Expected: 125\n", *Addend); return -1; } /* InterlockedCompareExchange (*Destination == Comparand) */ Destination = _aligned_malloc(sizeof(LONG), sizeof(LONG)); if (!Destination) { printf("Failed to allocate memory\n"); return -1; } *Destination = 0xAABBCCDD; oldValue = InterlockedCompareExchange(Destination, 0xCCDDEEFF, 0xAABBCCDD); if (oldValue != 0xAABBCCDD) { printf("InterlockedCompareExchange failure: Actual: 0x%08"PRIX32", Expected: 0xAABBCCDD\n", oldValue); return -1; } if (*Destination != 0xCCDDEEFF) { printf("InterlockedCompareExchange failure: Actual: 0x%08"PRIX32", Expected: 0xCCDDEEFF\n", *Destination); return -1; } /* InterlockedCompareExchange (*Destination != Comparand) */ *Destination = 0xAABBCCDD; oldValue = InterlockedCompareExchange(Destination, 0xCCDDEEFF, 0x66778899); if (oldValue != 0xAABBCCDD) { printf("InterlockedCompareExchange failure: Actual: 0x%08"PRIX32", Expected: 0xAABBCCDD\n", oldValue); return -1; } if (*Destination != 0xAABBCCDD) { printf("InterlockedCompareExchange failure: Actual: 0x%08"PRIX32", Expected: 0xAABBCCDD\n", *Destination); return -1; } /* InterlockedCompareExchange64 (*Destination == Comparand) */ Destination64 = _aligned_malloc(sizeof(LONGLONG), sizeof(LONGLONG)); if (!Destination64) { printf("Failed to allocate memory\n"); return -1; } *Destination64 = 0x66778899AABBCCDD; oldValue64 = InterlockedCompareExchange64(Destination64, 0x8899AABBCCDDEEFF, 0x66778899AABBCCDD); if (oldValue64 != 0x66778899AABBCCDD) { printf("InterlockedCompareExchange failure: Actual: 0x%016"PRIX64", Expected: 0x66778899AABBCCDD\n", oldValue64); return -1; } if (*Destination64 != 0x8899AABBCCDDEEFF) { printf("InterlockedCompareExchange failure: Actual: 0x%016"PRIX64", Expected: 0x8899AABBCCDDEEFF\n", *Destination64); return -1; } /* InterlockedCompareExchange64 (*Destination != Comparand) */ *Destination64 = 0x66778899AABBCCDD; oldValue64 = InterlockedCompareExchange64(Destination64, 0x8899AABBCCDDEEFF, 12345); if (oldValue64 != 0x66778899AABBCCDD) { printf("InterlockedCompareExchange failure: Actual: 0x%016"PRIX64", Expected: 0x66778899AABBCCDD\n", oldValue64); return -1; } if (*Destination64 != 0x66778899AABBCCDD) { printf("InterlockedCompareExchange failure: Actual: 0x%016"PRIX64", Expected: 0x66778899AABBCCDD\n", *Destination64); return -1; } _aligned_free(Addend); _aligned_free(Target); _aligned_free(Destination); _aligned_free(Destination64); return 0; }