summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement64/test2/test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/tests/palsuite/miscellaneous/InterlockedIncrement64/test2/test.cpp')
-rw-r--r--src/pal/tests/palsuite/miscellaneous/InterlockedIncrement64/test2/test.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement64/test2/test.cpp b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement64/test2/test.cpp
new file mode 100644
index 0000000000..1d579fe325
--- /dev/null
+++ b/src/pal/tests/palsuite/miscellaneous/InterlockedIncrement64/test2/test.cpp
@@ -0,0 +1,101 @@
+// 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: InterlockedIncrement64() 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;
+ }
+
+ /*
+ ** Run only on 64 bit platforms
+ */
+ #if defined(BIT64) && defined(PLATFORM_UNIX)
+
+ //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");
+ }
+ #endif //defined(BIT64) && defined(PLATFORM_UNIX)
+
+ PAL_Terminate();
+ return PASS;
+}
+
+void IncrementCounter(void)
+{
+ int i=0;
+
+ for (i=0; i<REPEAT_COUNT;i++)
+ {
+ InterlockedIncrement(&GlobalCounter);
+ }
+}
+
+
+