diff options
Diffstat (limited to 'src/pal/tests/palsuite/miscellaneous/InterlockedIncrement')
6 files changed, 216 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/CMakeLists.txt new file mode 100644 index 0000000000..ef14ea5352 --- /dev/null +++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +add_subdirectory(test1) +add_subdirectory(test2) + diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/CMakeLists.txt new file mode 100644 index 0000000000..f87dc72281 --- /dev/null +++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + test.cpp +) + +add_executable(paltest_interlockedincrement_test1 + ${SOURCES} +) + +add_dependencies(paltest_interlockedincrement_test1 coreclrpal) + +target_link_libraries(paltest_interlockedincrement_test1 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/test.cpp b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/test.cpp new file mode 100644 index 0000000000..8b4b3e9148 --- /dev/null +++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/test.cpp @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*============================================================ +** +** Source: test.c +** +** Purpose: InterlockedIncrement() function +** +** +**=========================================================*/ + +/* This test is FINISHED. Note: The biggest feature of this function is that + it locks the value before it increments it -- in order to make it so only + one thread can access it. But, I really don't have a great test to make + sure it's thread safe. Any ideas? Nothing I've tried has worked. +*/ + + +#include <palsuite.h> + +int __cdecl main(int argc, char *argv[]) +{ + + int TheValue = 0; + int TheReturn; + + /* + * Initialize the PAL and return FAILURE if this fails + */ + + if(0 != (PAL_Initialize(argc, argv))) + { + return FAIL; + } + + InterlockedIncrement(&TheValue); + TheReturn = InterlockedIncrement(&TheValue); + + /* Incremented twice, it should be 2 now */ + if(TheValue != 2) + { + Fail("ERROR: The value was incremented twice and shoud now be 2, " + "but it is really %d",TheValue); + } + + /* Check to make sure it returns itself */ + if(TheReturn != TheValue) + { + Fail("ERROR: The function should return the new value, which shoud " + "have been %d, but it returned %d.",TheValue,TheReturn); + } + + PAL_Terminate(); + return PASS; +} + + + + + diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/testinfo.dat b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/testinfo.dat new file mode 100644 index 0000000000..c304960030 --- /dev/null +++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/testinfo.dat @@ -0,0 +1,16 @@ +# Licensed to the .NET Foundation under one or more agreements. +# The .NET Foundation licenses this file to you under the MIT license. +# See the LICENSE file in the project root for more information. + +Version = 1.0 +Section = Miscellaneous +Function = InterlockedIncreement +Name = Positive test of InterlockedIncrement +TYPE = DEFAULT +EXE1 = test +Description += Test to see if this increments the variable correctly and += has the correct return value. + + + diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/CMakeLists.txt b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/CMakeLists.txt new file mode 100644 index 0000000000..e8c5278cbc --- /dev/null +++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.12.2) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(SOURCES + test.cpp +) + +add_executable(paltest_interlockedincrement_test2 + ${SOURCES} +) + +add_dependencies(paltest_interlockedincrement_test2 coreclrpal) + +target_link_libraries(paltest_interlockedincrement_test2 + pthread + m + coreclrpal +) diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/test.cpp b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/test.cpp new file mode 100644 index 0000000000..280a2ea709 --- /dev/null +++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/test.cpp @@ -0,0 +1,95 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*============================================================ +** +** Source : test.c +** +** Purpose: InterlockedIncrement() function +** +** The test case spawns MAX_THREADS Threads, and each thread call InterlockedDecrement Function to decrement a +** global counter REPEAT_COUNT Times. The Test case sets the global counter to Zero at the begining of the test. +** The test cases passes if at the end the test the value of the global counter is MAX_THREADS * REPEAT_COUNT. +** +** +**=========================================================*/ + +#include <palsuite.h> +#define MAX_THREADS 64 +#define REPEAT_COUNT 10000 + +LONG GlobalCounter = 0; + +void IncrementCounter(void); + + + +int __cdecl main(int argc, char *argv[]) +{ + + LONG TotalOperations=0; + int i=0; + DWORD dwThreadID = 0; + HANDLE hThread[MAX_THREADS]; + TotalOperations = MAX_THREADS * REPEAT_COUNT; + GlobalCounter = 0; + + /* + * Initialize the PAL and return FAILURE if this fails + */ + if(0 != (PAL_Initialize(argc, argv))) + { + return FAIL; + } + + //Create MAX_THREADS threads that will operate on the global counter + for (i=0;i<MAX_THREADS;i++) + { + hThread[i] = CreateThread( + NULL, // default security attributes + 0, // use default stack size + (LPTHREAD_START_ROUTINE) IncrementCounter, // thread function + NULL, // argument to thread function + 0, // use default creation flags + &dwThreadID); // returns the thread identifier + + // Check the return value for success. + + if (hThread[i] == NULL) + { + Fail("ERROR: Was not able to create thread\n" + "GetLastError returned %d\n", GetLastError()); + } + } + + //Wait for all threads to finish + for (i=0;i<MAX_THREADS;i++) + { + if (WAIT_OBJECT_0 != WaitForSingleObject (hThread[i], INFINITE)) + { + Fail ("Main: Wait for Single Object failed. Failing test.\n" + "GetLastError returned %d\n", GetLastError()); + } + } + + /* Compare the value of global counter with zero. + */ + + if (TotalOperations!=GlobalCounter) + { + Fail("Test Case Failed: InterlockedDecrement \n"); + } + + PAL_Terminate(); + return PASS; +} + +void IncrementCounter(void) +{ + int i=0; + for (i=0; i<REPEAT_COUNT;i++) + { + InterlockedIncrement(&GlobalCounter); + } +} |