aboutsummaryrefslogtreecommitdiff
path: root/src/libs/dutil/WixToolset.DUtil/queutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dutil/WixToolset.DUtil/queutil.cpp')
-rw-r--r--src/libs/dutil/WixToolset.DUtil/queutil.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/queutil.cpp b/src/libs/dutil/WixToolset.DUtil/queutil.cpp
new file mode 100644
index 00000000..c5d2d736
--- /dev/null
+++ b/src/libs/dutil/WixToolset.DUtil/queutil.cpp
@@ -0,0 +1,144 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6// Exit macros
7#define QueExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_QUEUTIL, x, s, __VA_ARGS__)
8#define QueExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_QUEUTIL, x, s, __VA_ARGS__)
9#define QueExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_QUEUTIL, x, s, __VA_ARGS__)
10#define QueExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_QUEUTIL, x, s, __VA_ARGS__)
11#define QueExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_QUEUTIL, x, s, __VA_ARGS__)
12#define QueExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_QUEUTIL, x, s, __VA_ARGS__)
13#define QueExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_QUEUTIL, p, x, e, s, __VA_ARGS__)
14#define QueExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_QUEUTIL, p, x, s, __VA_ARGS__)
15#define QueExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_QUEUTIL, p, x, e, s, __VA_ARGS__)
16#define QueExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_QUEUTIL, p, x, s, __VA_ARGS__)
17#define QueExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_QUEUTIL, e, x, s, __VA_ARGS__)
18#define QueExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_QUEUTIL, g, x, s, __VA_ARGS__)
19
20
21struct QUEUTIL_QUEUE_ITEM
22{
23 QUEUTIL_QUEUE_ITEM* pNext;
24 void* pvValue;
25};
26
27struct QUEUTIL_QUEUE_STRUCT
28{
29 QUEUTIL_QUEUE_ITEM* pFirst;
30 QUEUTIL_QUEUE_ITEM* pLast;
31};
32
33const int QUEUTIL_QUEUE_HANDLE_BYTES = sizeof(QUEUTIL_QUEUE_STRUCT);
34
35extern "C" HRESULT DAPI QueCreate(
36 __out_bcount(QUEUTIL_QUEUE_HANDLE_BYTES) QUEUTIL_QUEUE_HANDLE* phQueue
37 )
38{
39 HRESULT hr = S_OK;
40
41 QueExitOnNull(phQueue, hr, E_INVALIDARG, "Handle not specified while creating queue.");
42
43 *phQueue = reinterpret_cast<QUEUTIL_QUEUE_HANDLE>(MemAlloc(QUEUTIL_QUEUE_HANDLE_BYTES, TRUE));
44 QueExitOnNull(*phQueue, hr, E_OUTOFMEMORY, "Failed to allocate queue object.");
45
46LExit:
47 return hr;
48}
49
50extern "C" HRESULT DAPI QueEnqueue(
51 __in_bcount(QUEUTIL_QUEUE_HANDLE_BYTES) QUEUTIL_QUEUE_HANDLE hQueue,
52 __in void* pvValue
53 )
54{
55 HRESULT hr = S_OK;
56 QUEUTIL_QUEUE_ITEM* pItem = NULL;
57 QUEUTIL_QUEUE_STRUCT* pQueue = reinterpret_cast<QUEUTIL_QUEUE_STRUCT*>(hQueue);
58
59 QueExitOnNull(pQueue, hr, E_INVALIDARG, "Handle not specified while enqueing value.");
60
61 pItem = reinterpret_cast<QUEUTIL_QUEUE_ITEM*>(MemAlloc(sizeof(QUEUTIL_QUEUE_ITEM), TRUE));
62 QueExitOnNull(pItem, hr, E_OUTOFMEMORY, "Failed to allocate queue item.");
63
64 pItem->pvValue = pvValue;
65
66 if (!pQueue->pLast)
67 {
68 pQueue->pFirst = pItem;
69 }
70 else
71 {
72 pQueue->pLast->pNext = pItem;
73 }
74
75 pQueue->pLast = pItem;
76
77 pItem = NULL;
78
79LExit:
80 ReleaseMem(pItem);
81
82 return hr;
83}
84
85extern "C" HRESULT DAPI QueDequeue(
86 __in_bcount(QUEUTIL_QUEUE_HANDLE_BYTES) QUEUTIL_QUEUE_HANDLE hQueue,
87 __out void** ppvValue
88 )
89{
90 HRESULT hr = S_OK;
91 QUEUTIL_QUEUE_ITEM* pItem = NULL;
92 QUEUTIL_QUEUE_STRUCT* pQueue = reinterpret_cast<QUEUTIL_QUEUE_STRUCT*>(hQueue);
93
94 QueExitOnNull(pQueue, hr, E_INVALIDARG, "Handle not specified while dequeing value.");
95
96 if (!pQueue->pFirst)
97 {
98 *ppvValue = NULL;
99 ExitFunction1(hr = E_NOMOREITEMS);
100 }
101
102 pItem = pQueue->pFirst;
103
104 if (!pItem->pNext)
105 {
106 pQueue->pFirst = NULL;
107 pQueue->pLast = NULL;
108 }
109 else
110 {
111 pQueue->pFirst = pItem->pNext;
112 }
113
114 *ppvValue = pItem->pvValue;
115
116LExit:
117 ReleaseMem(pItem);
118
119 return hr;
120}
121
122extern "C" void DAPI QueDestroy(
123 __in_bcount(QUEUTIL_QUEUE_HANDLE_BYTES) QUEUTIL_QUEUE_HANDLE hQueue,
124 __in_opt PFNQUEUTIL_QUEUE_RELEASE_VALUE pfnReleaseValue,
125 __in_opt void* pvContext
126 )
127{
128 HRESULT hr = S_OK;
129 void* pvValue = NULL;
130
131 hr = hQueue ? QueDequeue(hQueue, &pvValue) : E_NOMOREITEMS;
132
133 while (SUCCEEDED(hr))
134 {
135 if (pfnReleaseValue)
136 {
137 pfnReleaseValue(pvValue, pvContext);
138 }
139
140 hr = QueDequeue(hQueue, &pvValue);
141 }
142
143 ReleaseMem(hQueue);
144}