summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/interlocked/test/TestInterlockedSList.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
commita9bcc81f821d7c66f623779fa5147e728eb3c388 (patch)
tree98676963bcdd537ae5908a067a8eb110b93486a6 /winpr/libwinpr/interlocked/test/TestInterlockedSList.c
parentInitial commit. (diff)
downloadfreerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.tar.xz
freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.zip
Adding upstream version 3.3.0+dfsg1.upstream/3.3.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'winpr/libwinpr/interlocked/test/TestInterlockedSList.c')
-rw-r--r--winpr/libwinpr/interlocked/test/TestInterlockedSList.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/winpr/libwinpr/interlocked/test/TestInterlockedSList.c b/winpr/libwinpr/interlocked/test/TestInterlockedSList.c
new file mode 100644
index 0000000..71ac8bc
--- /dev/null
+++ b/winpr/libwinpr/interlocked/test/TestInterlockedSList.c
@@ -0,0 +1,85 @@
+
+#include <stdio.h>
+#include <winpr/crt.h>
+#include <winpr/windows.h>
+#include <winpr/interlocked.h>
+
+typedef struct
+{
+ WINPR_SLIST_ENTRY ItemEntry;
+ ULONG Signature;
+} PROGRAM_ITEM, *PPROGRAM_ITEM;
+
+int TestInterlockedSList(int argc, char* argv[])
+{
+ ULONG Count = 0;
+ WINPR_PSLIST_ENTRY pFirstEntry = NULL;
+ WINPR_PSLIST_HEADER pListHead = NULL;
+ WINPR_UNUSED(argc);
+ WINPR_UNUSED(argv);
+ /* Initialize the list header to a MEMORY_ALLOCATION_ALIGNMENT boundary. */
+ pListHead = (WINPR_PSLIST_HEADER)winpr_aligned_malloc(sizeof(WINPR_SLIST_HEADER),
+ MEMORY_ALLOCATION_ALIGNMENT);
+
+ if (!pListHead)
+ {
+ printf("Memory allocation failed.\n");
+ return -1;
+ }
+
+ InitializeSListHead(pListHead);
+
+ /* Insert 10 items into the list. */
+ for (Count = 1; Count <= 10; Count += 1)
+ {
+ PPROGRAM_ITEM pProgramItem =
+ (PPROGRAM_ITEM)winpr_aligned_malloc(sizeof(PROGRAM_ITEM), MEMORY_ALLOCATION_ALIGNMENT);
+
+ if (!pProgramItem)
+ {
+ printf("Memory allocation failed.\n");
+ return -1;
+ }
+
+ pProgramItem->Signature = Count;
+ pFirstEntry = InterlockedPushEntrySList(pListHead, &(pProgramItem->ItemEntry));
+ }
+
+ /* Remove 10 items from the list and display the signature. */
+ for (Count = 10; Count >= 1; Count -= 1)
+ {
+ PPROGRAM_ITEM pProgramItem = NULL;
+ WINPR_PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead);
+
+ if (!pListEntry)
+ {
+ printf("List is empty.\n");
+ return -1;
+ }
+
+ pProgramItem = (PPROGRAM_ITEM)pListEntry;
+ printf("Signature is %" PRIu32 "\n", pProgramItem->Signature);
+
+ /*
+ * This example assumes that the SLIST_ENTRY structure is the
+ * first member of the structure. If your structure does not
+ * follow this convention, you must compute the starting address
+ * of the structure before calling the free function.
+ */
+
+ winpr_aligned_free(pListEntry);
+ }
+
+ /* Flush the list and verify that the items are gone. */
+ pFirstEntry = InterlockedPopEntrySList(pListHead);
+
+ if (pFirstEntry)
+ {
+ printf("Error: List is not empty.\n");
+ return -1;
+ }
+
+ winpr_aligned_free(pListHead);
+
+ return 0;
+}