summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/tests/palsuite/miscellaneous/InterlockedIncrement')
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/CMakeLists.txt5
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/CMakeLists.txt19
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/test.cpp62
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test1/testinfo.dat16
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/CMakeLists.txt19
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement/test2/test.cpp95
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);
+ }
+}