VirtualBox

source: vbox/trunk/src/VBox/Runtime/r3/win32/sems-win32.cpp@ 4071

最後變更 在這個檔案從4071是 4071,由 vboxsync 提交於 18 年 前

Biggest check-in ever. New source code headers for all (C) innotek files.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id
檔案大小: 7.1 KB
 
1/* $Id: sems-win32.cpp 4071 2007-08-07 17:07:59Z vboxsync $ */
2/** @file
3 * innotek Portable Runtime - Semaphores, implementation for Windows host platform.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*******************************************************************************
20* Header Files *
21*******************************************************************************/
22#define LOG_GROUP RTLOGGROUP_SEMAPHORE
23#include <Windows.h>
24
25#include <iprt/semaphore.h>
26#include <iprt/assert.h>
27#include <iprt/err.h>
28
29
30/** Converts semaphore to win32 handle. */
31#define SEM2HND(Sem) ((HANDLE)(uintptr_t)Sem)
32
33
34
35RTDECL(int) RTSemEventCreate(PRTSEMEVENT pEventSem)
36{
37 /*
38 * Create the semaphore.
39 * (Auto reset, not signaled, private event object.)
40 */
41 HANDLE hev = CreateEvent(NULL, FALSE, FALSE, NULL);
42 if (hev)
43 {
44 *pEventSem = (RTSEMEVENT)(void *)hev;
45 return VINF_SUCCESS;
46 }
47 return RTErrConvertFromWin32(GetLastError());
48}
49
50
51RTDECL(int) RTSemEventDestroy(RTSEMEVENT EventSem)
52{
53 /*
54 * Close semaphore handle.
55 */
56 if (CloseHandle(SEM2HND(EventSem)))
57 return VINF_SUCCESS;
58 AssertMsgFailed(("Destroy EventSem %p failed, lasterr=%d\n", EventSem, GetLastError()));
59 return RTErrConvertFromWin32(GetLastError());
60}
61
62
63RTDECL(int) RTSemEventWaitNoResume(RTSEMEVENT EventSem, unsigned cMillies)
64{
65 /*
66 * Wait for condition.
67 */
68 int rc = WaitForSingleObjectEx(SEM2HND(EventSem), cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies, TRUE);
69 switch (rc)
70 {
71 case WAIT_OBJECT_0: return VINF_SUCCESS;
72 case WAIT_TIMEOUT: return VERR_TIMEOUT;
73 case WAIT_IO_COMPLETION: return VERR_INTERRUPTED;
74 case WAIT_ABANDONED: return VERR_SEM_OWNER_DIED;
75 default:
76 {
77 AssertMsgFailed(("Wait on EventSem %p failed, rc=%d lasterr=%d\n", EventSem, rc, GetLastError()));
78 int rc2 = RTErrConvertFromWin32(GetLastError());
79 if (rc2)
80 return rc2;
81
82 AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
83 return VERR_INTERNAL_ERROR;
84 }
85 }
86}
87
88
89RTDECL(int) RTSemEventSignal(RTSEMEVENT EventSem)
90{
91 /*
92 * Signal the object.
93 */
94 if (SetEvent(SEM2HND(EventSem)))
95 return VINF_SUCCESS;
96 AssertMsgFailed(("Signaling EventSem %p failed, lasterr=%d\n", EventSem, GetLastError()));
97 return RTErrConvertFromWin32(GetLastError());
98}
99
100
101
102
103RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem)
104{
105 /*
106 * Create the semaphore.
107 * (Manual reset, not signaled, private event object.)
108 */
109 HANDLE hev = CreateEvent(NULL, TRUE, FALSE, NULL);
110 if (hev)
111 {
112 *pEventMultiSem = (RTSEMEVENTMULTI)(void *)hev;
113 return VINF_SUCCESS;
114 }
115 return RTErrConvertFromWin32(GetLastError());
116}
117
118
119RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)
120{
121 /*
122 * Close semaphore handle.
123 */
124 if (CloseHandle(SEM2HND(EventMultiSem)))
125 return VINF_SUCCESS;
126 AssertMsgFailed(("Destroy EventMultiSem %p failed, lasterr=%d\n", EventMultiSem, GetLastError()));
127 return RTErrConvertFromWin32(GetLastError());
128}
129
130
131RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)
132{
133 /*
134 * Signal the object.
135 */
136 if (SetEvent(SEM2HND(EventMultiSem)))
137 return VINF_SUCCESS;
138 AssertMsgFailed(("Signaling EventMultiSem %p failed, lasterr=%d\n", EventMultiSem, GetLastError()));
139 return RTErrConvertFromWin32(GetLastError());
140}
141
142
143RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)
144{
145 /*
146 * Reset the object.
147 */
148 if (ResetEvent(SEM2HND(EventMultiSem)))
149 return VINF_SUCCESS;
150 AssertMsgFailed(("Resetting EventMultiSem %p failed, lasterr=%d\n", EventMultiSem, GetLastError()));
151 return RTErrConvertFromWin32(GetLastError());
152}
153
154
155RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)
156{
157 /*
158 * Wait for condition.
159 */
160 int rc = WaitForSingleObjectEx(SEM2HND(EventMultiSem), cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies, TRUE);
161 switch (rc)
162 {
163 case WAIT_OBJECT_0: return VINF_SUCCESS;
164 case WAIT_TIMEOUT: return VERR_TIMEOUT;
165 case WAIT_IO_COMPLETION: return VERR_INTERRUPTED;
166 case WAIT_ABANDONED: return VERR_SEM_OWNER_DIED;
167 default:
168 {
169 AssertMsgFailed(("Wait on EventMultiSem %p failed, rc=%d lasterr=%d\n", EventMultiSem, rc, GetLastError()));
170 int rc2 = RTErrConvertFromWin32(GetLastError());
171 if (rc2)
172 return rc2;
173
174 AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
175 return VERR_INTERNAL_ERROR;
176 }
177 }
178}
179
180
181
182
183RTDECL(int) RTSemMutexCreate(PRTSEMMUTEX pMutexSem)
184{
185 /*
186 * Create the semaphore.
187 */
188 HANDLE hmtx = CreateMutex(NULL, FALSE, NULL);
189 if (hmtx)
190 {
191 *pMutexSem = (RTSEMMUTEX)(void *)hmtx;
192 return VINF_SUCCESS;
193 }
194
195 return RTErrConvertFromWin32(GetLastError());
196}
197
198
199RTDECL(int) RTSemMutexDestroy(RTSEMMUTEX MutexSem)
200{
201 /*
202 * Close semaphore handle.
203 */
204 if (CloseHandle(SEM2HND(MutexSem)))
205 return VINF_SUCCESS;
206 AssertMsgFailed(("Destroy MutexSem %p failed, lasterr=%d\n", MutexSem, GetLastError()));
207 return RTErrConvertFromWin32(GetLastError());
208}
209
210
211RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX MutexSem, unsigned cMillies)
212{
213 /*
214 * Lock mutex semaphore.
215 */
216 int rc = WaitForSingleObjectEx(SEM2HND(MutexSem), cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies, TRUE);
217 switch (rc)
218 {
219 case WAIT_OBJECT_0: return VINF_SUCCESS;
220 case WAIT_TIMEOUT: return VERR_TIMEOUT;
221 case WAIT_IO_COMPLETION: return VERR_INTERRUPTED;
222 case WAIT_ABANDONED: return VERR_SEM_OWNER_DIED;
223 default:
224 {
225 AssertMsgFailed(("Wait on MutexSem %p failed, rc=%d lasterr=%d\n", MutexSem, rc, GetLastError()));
226 int rc2 = RTErrConvertFromWin32(GetLastError());
227 if (rc2 != 0)
228 return rc2;
229
230 AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
231 return VERR_INTERNAL_ERROR;
232 }
233 }
234}
235
236RTDECL(int) RTSemMutexRelease(RTSEMMUTEX MutexSem)
237{
238 /*
239 * Unlock mutex semaphore.
240 */
241 if (ReleaseMutex(SEM2HND(MutexSem)))
242 return VINF_SUCCESS;
243 AssertMsgFailed(("Release MutexSem %p failed, lasterr=%d\n", MutexSem, GetLastError()));
244 return RTErrConvertFromWin32(GetLastError());
245}
246
247
248
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette