VirtualBox

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

Last change on this file since 4015 was 2981, checked in by vboxsync, 17 years ago

InnoTek -> innotek: all the headers and comments.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.3 KB
Line 
1/* $Id: sems-win32.cpp 2981 2007-06-01 16:01:28Z 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.virtualbox.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 * If you received this file as part of a commercial VirtualBox
18 * distribution, then only the terms of your commercial VirtualBox
19 * license agreement apply instead of the previous paragraph.
20 */
21
22
23/*******************************************************************************
24* Header Files *
25*******************************************************************************/
26#define LOG_GROUP RTLOGGROUP_SEMAPHORE
27#include <Windows.h>
28
29#include <iprt/semaphore.h>
30#include <iprt/assert.h>
31#include <iprt/err.h>
32
33
34/** Converts semaphore to win32 handle. */
35#define SEM2HND(Sem) ((HANDLE)(uintptr_t)Sem)
36
37
38
39RTDECL(int) RTSemEventCreate(PRTSEMEVENT pEventSem)
40{
41 /*
42 * Create the semaphore.
43 * (Auto reset, not signaled, private event object.)
44 */
45 HANDLE hev = CreateEvent(NULL, FALSE, FALSE, NULL);
46 if (hev)
47 {
48 *pEventSem = (RTSEMEVENT)(void *)hev;
49 return VINF_SUCCESS;
50 }
51 return RTErrConvertFromWin32(GetLastError());
52}
53
54
55RTDECL(int) RTSemEventDestroy(RTSEMEVENT EventSem)
56{
57 /*
58 * Close semaphore handle.
59 */
60 if (CloseHandle(SEM2HND(EventSem)))
61 return VINF_SUCCESS;
62 AssertMsgFailed(("Destroy EventSem %p failed, lasterr=%d\n", EventSem, GetLastError()));
63 return RTErrConvertFromWin32(GetLastError());
64}
65
66
67RTDECL(int) RTSemEventWaitNoResume(RTSEMEVENT EventSem, unsigned cMillies)
68{
69 /*
70 * Wait for condition.
71 */
72 int rc = WaitForSingleObjectEx(SEM2HND(EventSem), cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies, TRUE);
73 switch (rc)
74 {
75 case WAIT_OBJECT_0: return VINF_SUCCESS;
76 case WAIT_TIMEOUT: return VERR_TIMEOUT;
77 case WAIT_IO_COMPLETION: return VERR_INTERRUPTED;
78 case WAIT_ABANDONED: return VERR_SEM_OWNER_DIED;
79 default:
80 {
81 AssertMsgFailed(("Wait on EventSem %p failed, rc=%d lasterr=%d\n", EventSem, rc, GetLastError()));
82 int rc2 = RTErrConvertFromWin32(GetLastError());
83 if (rc2)
84 return rc2;
85
86 AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
87 return VERR_INTERNAL_ERROR;
88 }
89 }
90}
91
92
93RTDECL(int) RTSemEventSignal(RTSEMEVENT EventSem)
94{
95 /*
96 * Signal the object.
97 */
98 if (SetEvent(SEM2HND(EventSem)))
99 return VINF_SUCCESS;
100 AssertMsgFailed(("Signaling EventSem %p failed, lasterr=%d\n", EventSem, GetLastError()));
101 return RTErrConvertFromWin32(GetLastError());
102}
103
104
105
106
107RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem)
108{
109 /*
110 * Create the semaphore.
111 * (Manual reset, not signaled, private event object.)
112 */
113 HANDLE hev = CreateEvent(NULL, TRUE, FALSE, NULL);
114 if (hev)
115 {
116 *pEventMultiSem = (RTSEMEVENTMULTI)(void *)hev;
117 return VINF_SUCCESS;
118 }
119 return RTErrConvertFromWin32(GetLastError());
120}
121
122
123RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)
124{
125 /*
126 * Close semaphore handle.
127 */
128 if (CloseHandle(SEM2HND(EventMultiSem)))
129 return VINF_SUCCESS;
130 AssertMsgFailed(("Destroy EventMultiSem %p failed, lasterr=%d\n", EventMultiSem, GetLastError()));
131 return RTErrConvertFromWin32(GetLastError());
132}
133
134
135RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)
136{
137 /*
138 * Signal the object.
139 */
140 if (SetEvent(SEM2HND(EventMultiSem)))
141 return VINF_SUCCESS;
142 AssertMsgFailed(("Signaling EventMultiSem %p failed, lasterr=%d\n", EventMultiSem, GetLastError()));
143 return RTErrConvertFromWin32(GetLastError());
144}
145
146
147RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)
148{
149 /*
150 * Reset the object.
151 */
152 if (ResetEvent(SEM2HND(EventMultiSem)))
153 return VINF_SUCCESS;
154 AssertMsgFailed(("Resetting EventMultiSem %p failed, lasterr=%d\n", EventMultiSem, GetLastError()));
155 return RTErrConvertFromWin32(GetLastError());
156}
157
158
159RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)
160{
161 /*
162 * Wait for condition.
163 */
164 int rc = WaitForSingleObjectEx(SEM2HND(EventMultiSem), cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies, TRUE);
165 switch (rc)
166 {
167 case WAIT_OBJECT_0: return VINF_SUCCESS;
168 case WAIT_TIMEOUT: return VERR_TIMEOUT;
169 case WAIT_IO_COMPLETION: return VERR_INTERRUPTED;
170 case WAIT_ABANDONED: return VERR_SEM_OWNER_DIED;
171 default:
172 {
173 AssertMsgFailed(("Wait on EventMultiSem %p failed, rc=%d lasterr=%d\n", EventMultiSem, rc, GetLastError()));
174 int rc2 = RTErrConvertFromWin32(GetLastError());
175 if (rc2)
176 return rc2;
177
178 AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
179 return VERR_INTERNAL_ERROR;
180 }
181 }
182}
183
184
185
186
187RTDECL(int) RTSemMutexCreate(PRTSEMMUTEX pMutexSem)
188{
189 /*
190 * Create the semaphore.
191 */
192 HANDLE hmtx = CreateMutex(NULL, FALSE, NULL);
193 if (hmtx)
194 {
195 *pMutexSem = (RTSEMMUTEX)(void *)hmtx;
196 return VINF_SUCCESS;
197 }
198
199 return RTErrConvertFromWin32(GetLastError());
200}
201
202
203RTDECL(int) RTSemMutexDestroy(RTSEMMUTEX MutexSem)
204{
205 /*
206 * Close semaphore handle.
207 */
208 if (CloseHandle(SEM2HND(MutexSem)))
209 return VINF_SUCCESS;
210 AssertMsgFailed(("Destroy MutexSem %p failed, lasterr=%d\n", MutexSem, GetLastError()));
211 return RTErrConvertFromWin32(GetLastError());
212}
213
214
215RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX MutexSem, unsigned cMillies)
216{
217 /*
218 * Lock mutex semaphore.
219 */
220 int rc = WaitForSingleObjectEx(SEM2HND(MutexSem), cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies, TRUE);
221 switch (rc)
222 {
223 case WAIT_OBJECT_0: return VINF_SUCCESS;
224 case WAIT_TIMEOUT: return VERR_TIMEOUT;
225 case WAIT_IO_COMPLETION: return VERR_INTERRUPTED;
226 case WAIT_ABANDONED: return VERR_SEM_OWNER_DIED;
227 default:
228 {
229 AssertMsgFailed(("Wait on MutexSem %p failed, rc=%d lasterr=%d\n", MutexSem, rc, GetLastError()));
230 int rc2 = RTErrConvertFromWin32(GetLastError());
231 if (rc2 != 0)
232 return rc2;
233
234 AssertMsgFailed(("WaitForSingleObject(event) -> rc=%d while converted lasterr=%d\n", rc, rc2));
235 return VERR_INTERNAL_ERROR;
236 }
237 }
238}
239
240RTDECL(int) RTSemMutexRelease(RTSEMMUTEX MutexSem)
241{
242 /*
243 * Unlock mutex semaphore.
244 */
245 if (ReleaseMutex(SEM2HND(MutexSem)))
246 return VINF_SUCCESS;
247 AssertMsgFailed(("Release MutexSem %p failed, lasterr=%d\n", MutexSem, GetLastError()));
248 return RTErrConvertFromWin32(GetLastError());
249}
250
251
252
Note: See TracBrowser for help on using the repository browser.

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