VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/SUPLibSem.cpp@ 87593

Last change on this file since 87593 was 82968, checked in by vboxsync, 5 years ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1/* $Id: SUPLibSem.cpp 82968 2020-02-04 10:35:17Z vboxsync $ */
2/** @file
3 * VirtualBox Support Library - Semaphores, ring-3 implementation.
4 */
5
6/*
7 * Copyright (C) 2009-2020 Oracle Corporation
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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#define LOG_GROUP LOG_GROUP_SUP
32#include <VBox/sup.h>
33
34#include <iprt/errcore.h>
35#include <VBox/param.h>
36#include <iprt/assert.h>
37
38#include "SUPLibInternal.h"
39#include "SUPDrvIOC.h"
40
41
42/**
43 * Worker that makes a SUP_IOCTL_SEM_OP2 request.
44 *
45 * @returns VBox status code.
46 * @param pSession The session handle.
47 * @param uType The semaphore type.
48 * @param hSem The semaphore handle.
49 * @param uOp The operation.
50 * @param u64Arg The argument if applicable, otherwise 0.
51 */
52DECLINLINE(int) supSemOp2(PSUPDRVSESSION pSession, uint32_t uType, uintptr_t hSem, uint32_t uOp, uint64_t u64Arg)
53{
54 NOREF(pSession);
55 SUPSEMOP2 Req;
56 Req.Hdr.u32Cookie = g_u32Cookie;
57 Req.Hdr.u32SessionCookie = g_u32SessionCookie;
58 Req.Hdr.cbIn = SUP_IOCTL_SEM_OP2_SIZE_IN;
59 Req.Hdr.cbOut = SUP_IOCTL_SEM_OP2_SIZE_OUT;
60 Req.Hdr.fFlags = SUPREQHDR_FLAGS_DEFAULT;
61 Req.Hdr.rc = VERR_INTERNAL_ERROR;
62 Req.u.In.uType = uType;
63 Req.u.In.hSem = (uint32_t)hSem;
64 AssertReturn(Req.u.In.hSem == hSem, VERR_INVALID_HANDLE);
65 Req.u.In.uOp = uOp;
66 Req.u.In.uReserved = 0;
67 Req.u.In.uArg.u64 = u64Arg;
68 int rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_SEM_OP2, &Req, sizeof(Req));
69 if (RT_SUCCESS(rc))
70 rc = Req.Hdr.rc;
71
72 return rc;
73}
74
75
76/**
77 * Worker that makes a SUP_IOCTL_SEM_OP3 request.
78 *
79 * @returns VBox status code.
80 * @param pSession The session handle.
81 * @param uType The semaphore type.
82 * @param hSem The semaphore handle.
83 * @param uOp The operation.
84 * @param pReq The request structure. The caller should pick
85 * the output data from it himself.
86 */
87DECLINLINE(int) supSemOp3(PSUPDRVSESSION pSession, uint32_t uType, uintptr_t hSem, uint32_t uOp, PSUPSEMOP3 pReq)
88{
89 NOREF(pSession);
90 pReq->Hdr.u32Cookie = g_u32Cookie;
91 pReq->Hdr.u32SessionCookie = g_u32SessionCookie;
92 pReq->Hdr.cbIn = SUP_IOCTL_SEM_OP3_SIZE_IN;
93 pReq->Hdr.cbOut = SUP_IOCTL_SEM_OP3_SIZE_OUT;
94 pReq->Hdr.fFlags = SUPREQHDR_FLAGS_DEFAULT;
95 pReq->Hdr.rc = VERR_INTERNAL_ERROR;
96 pReq->u.In.uType = uType;
97 pReq->u.In.hSem = (uint32_t)hSem;
98 AssertReturn(pReq->u.In.hSem == hSem, VERR_INVALID_HANDLE);
99 pReq->u.In.uOp = uOp;
100 pReq->u.In.u32Reserved = 0;
101 pReq->u.In.u64Reserved = 0;
102 int rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_SEM_OP3, pReq, sizeof(*pReq));
103 if (RT_SUCCESS(rc))
104 rc = pReq->Hdr.rc;
105
106 return rc;
107}
108
109
110SUPDECL(int) SUPSemEventCreate(PSUPDRVSESSION pSession, PSUPSEMEVENT phEvent)
111{
112 AssertPtrReturn(phEvent, VERR_INVALID_POINTER);
113
114 SUPSEMOP3 Req;
115 int rc = supSemOp3(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)NIL_SUPSEMEVENT, SUPSEMOP3_CREATE, &Req);
116 if (RT_SUCCESS(rc))
117 *phEvent = (SUPSEMEVENT)(uintptr_t)Req.u.Out.hSem;
118 return rc;
119}
120
121
122SUPDECL(int) SUPSemEventClose(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent)
123{
124 if (hEvent == NIL_SUPSEMEVENT)
125 return VINF_SUCCESS;
126 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)hEvent, SUPSEMOP2_CLOSE, 0);
127}
128
129
130SUPDECL(int) SUPSemEventSignal(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent)
131{
132 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)hEvent, SUPSEMOP2_SIGNAL, 0);
133}
134
135
136SUPDECL(int) SUPSemEventWaitNoResume(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, uint32_t cMillies)
137{
138 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)hEvent, SUPSEMOP2_WAIT_MS_REL, cMillies);
139}
140
141
142SUPDECL(int) SUPSemEventWaitNsAbsIntr(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, uint64_t uNsTimeout)
143{
144 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)hEvent, SUPSEMOP2_WAIT_NS_ABS, uNsTimeout);
145}
146
147
148SUPDECL(int) SUPSemEventWaitNsRelIntr(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, uint64_t cNsTimeout)
149{
150 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)hEvent, SUPSEMOP2_WAIT_NS_REL, cNsTimeout);
151}
152
153
154SUPDECL(uint32_t) SUPSemEventGetResolution(PSUPDRVSESSION pSession)
155{
156 SUPSEMOP3 Req;
157 int rc = supSemOp3(pSession, SUP_SEM_TYPE_EVENT, (uintptr_t)NIL_SUPSEMEVENT, SUPSEMOP3_GET_RESOLUTION, &Req);
158 if (RT_SUCCESS(rc))
159 return Req.u.Out.cNsResolution;
160 return 1000 / 100;
161}
162
163
164
165
166
167SUPDECL(int) SUPSemEventMultiCreate(PSUPDRVSESSION pSession, PSUPSEMEVENTMULTI phEventMulti)
168{
169 AssertPtrReturn(phEventMulti, VERR_INVALID_POINTER);
170
171 SUPSEMOP3 Req;
172 int rc = supSemOp3(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)NIL_SUPSEMEVENTMULTI, SUPSEMOP3_CREATE, &Req);
173 if (RT_SUCCESS(rc))
174 *phEventMulti = (SUPSEMEVENTMULTI)(uintptr_t)Req.u.Out.hSem;
175 return rc;
176}
177
178
179SUPDECL(int) SUPSemEventMultiClose(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti)
180{
181 if (hEventMulti == NIL_SUPSEMEVENTMULTI)
182 return VINF_SUCCESS;
183 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)hEventMulti, SUPSEMOP2_CLOSE, 0);
184}
185
186
187SUPDECL(int) SUPSemEventMultiSignal(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti)
188{
189 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)hEventMulti, SUPSEMOP2_SIGNAL, 0);
190}
191
192
193SUPDECL(int) SUPSemEventMultiReset(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti)
194{
195 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)hEventMulti, SUPSEMOP2_RESET, 0);
196}
197
198
199SUPDECL(int) SUPSemEventMultiWaitNoResume(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint32_t cMillies)
200{
201 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)hEventMulti, SUPSEMOP2_WAIT_MS_REL, cMillies);
202}
203
204
205SUPDECL(int) SUPSemEventMultiWaitNsAbsIntr(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint64_t uNsTimeout)
206{
207 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)hEventMulti, SUPSEMOP2_WAIT_NS_ABS, uNsTimeout);
208}
209
210
211SUPDECL(int) SUPSemEventMultiWaitNsRelIntr(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint64_t cNsTimeout)
212{
213 return supSemOp2(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)hEventMulti, SUPSEMOP2_WAIT_NS_REL, cNsTimeout);
214}
215
216
217SUPDECL(uint32_t) SUPSemEventMultiGetResolution(PSUPDRVSESSION pSession)
218{
219 SUPSEMOP3 Req;
220 int rc = supSemOp3(pSession, SUP_SEM_TYPE_EVENT_MULTI, (uintptr_t)NIL_SUPSEMEVENTMULTI, SUPSEMOP3_GET_RESOLUTION, &Req);
221 if (RT_SUCCESS(rc))
222 return Req.u.Out.cNsResolution;
223 return 1000 / 100;
224}
225
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