VirtualBox

source: vbox/trunk/include/VBox/vmm/pdmthread.h@ 100726

Last change on this file since 100726 was 98103, checked in by vboxsync, 23 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 9.7 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, Threads.
3 */
4
5/*
6 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef VBOX_INCLUDED_vmm_pdmthread_h
37#define VBOX_INCLUDED_vmm_pdmthread_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#include <VBox/cdefs.h>
43#include <VBox/types.h>
44#ifdef IN_RING3
45# include <iprt/thread.h>
46#endif
47
48RT_C_DECLS_BEGIN
49
50/** @defgroup grp_pdm_thread The PDM Threads API
51 * @ingroup grp_pdm
52 * @{
53 */
54
55/**
56 * The thread state
57 */
58typedef enum PDMTHREADSTATE
59{
60 /** The usual invalid 0 entry. */
61 PDMTHREADSTATE_INVALID = 0,
62 /** The thread is initializing.
63 * Prev state: none
64 * Next state: suspended, terminating (error) */
65 PDMTHREADSTATE_INITIALIZING,
66 /** The thread has been asked to suspend.
67 * Prev state: running
68 * Next state: suspended */
69 PDMTHREADSTATE_SUSPENDING,
70 /** The thread is supended.
71 * Prev state: suspending, initializing
72 * Next state: resuming, terminated. */
73 PDMTHREADSTATE_SUSPENDED,
74 /** The thread is active.
75 * Prev state: suspended
76 * Next state: running, terminating. */
77 PDMTHREADSTATE_RESUMING,
78 /** The thread is active.
79 * Prev state: resuming
80 * Next state: suspending, terminating. */
81 PDMTHREADSTATE_RUNNING,
82 /** The thread has been asked to terminate.
83 * Prev state: initializing, suspended, resuming, running
84 * Next state: terminated. */
85 PDMTHREADSTATE_TERMINATING,
86 /** The thread is terminating / has terminated.
87 * Prev state: terminating
88 * Next state: none */
89 PDMTHREADSTATE_TERMINATED,
90 /** The usual 32-bit hack. */
91 PDMTHREADSTATE_32BIT_HACK = 0x7fffffff
92} PDMTHREADSTATE;
93
94/** A pointer to a PDM thread. */
95typedef R3PTRTYPE(struct PDMTHREAD *) PPDMTHREAD;
96/** A pointer to a pointer to a PDM thread. */
97typedef PPDMTHREAD *PPPDMTHREAD;
98
99/**
100 * PDM thread, device variation.
101 *
102 * @returns VBox status code.
103 * @param pDevIns The device instance.
104 * @param pThread The PDM thread data.
105 */
106typedef DECLCALLBACKTYPE(int, FNPDMTHREADDEV,(PPDMDEVINS pDevIns, PPDMTHREAD pThread));
107/** Pointer to a FNPDMTHREADDEV(). */
108typedef FNPDMTHREADDEV *PFNPDMTHREADDEV;
109
110/**
111 * PDM thread, USB device variation.
112 *
113 * @returns VBox status code.
114 * @param pUsbIns The USB device instance.
115 * @param pThread The PDM thread data.
116 */
117typedef DECLCALLBACKTYPE(int, FNPDMTHREADUSB,(PPDMUSBINS pUsbIns, PPDMTHREAD pThread));
118/** Pointer to a FNPDMTHREADUSB(). */
119typedef FNPDMTHREADUSB *PFNPDMTHREADUSB;
120
121/**
122 * PDM thread, driver variation.
123 *
124 * @returns VBox status code.
125 * @param pDrvIns The driver instance.
126 * @param pThread The PDM thread data.
127 */
128typedef DECLCALLBACKTYPE(int, FNPDMTHREADDRV,(PPDMDRVINS pDrvIns, PPDMTHREAD pThread));
129/** Pointer to a FNPDMTHREADDRV(). */
130typedef FNPDMTHREADDRV *PFNPDMTHREADDRV;
131
132/**
133 * PDM thread, driver variation.
134 *
135 * @returns VBox status code.
136 * @param pVM The cross context VM structure.
137 * @param pThread The PDM thread data.
138 */
139typedef DECLCALLBACKTYPE(int, FNPDMTHREADINT,(PVM pVM, PPDMTHREAD pThread));
140/** Pointer to a FNPDMTHREADINT(). */
141typedef FNPDMTHREADINT *PFNPDMTHREADINT;
142
143/**
144 * PDM thread, driver variation.
145 *
146 * @returns VBox status code.
147 * @param pThread The PDM thread data.
148 */
149typedef int FNPDMTHREADEXT(PPDMTHREAD pThread);
150/** Pointer to a FNPDMTHREADEXT(). */
151typedef FNPDMTHREADEXT *PFNPDMTHREADEXT;
152
153
154
155/**
156 * PDM thread wakeup call, device variation.
157 *
158 * @returns VBox status code.
159 * @param pDevIns The device instance.
160 * @param pThread The PDM thread data.
161 */
162typedef DECLCALLBACKTYPE(int, FNPDMTHREADWAKEUPDEV,(PPDMDEVINS pDevIns, PPDMTHREAD pThread));
163/** Pointer to a FNPDMTHREADDEV(). */
164typedef FNPDMTHREADWAKEUPDEV *PFNPDMTHREADWAKEUPDEV;
165
166/**
167 * PDM thread wakeup call, device variation.
168 *
169 * @returns VBox status code.
170 * @param pUsbIns The USB device instance.
171 * @param pThread The PDM thread data.
172 */
173typedef DECLCALLBACKTYPE(int, FNPDMTHREADWAKEUPUSB,(PPDMUSBINS pUsbIns, PPDMTHREAD pThread));
174/** Pointer to a FNPDMTHREADUSB(). */
175typedef FNPDMTHREADWAKEUPUSB *PFNPDMTHREADWAKEUPUSB;
176
177/**
178 * PDM thread wakeup call, driver variation.
179 *
180 * @returns VBox status code.
181 * @param pDrvIns The driver instance.
182 * @param pThread The PDM thread data.
183 */
184typedef DECLCALLBACKTYPE(int, FNPDMTHREADWAKEUPDRV,(PPDMDRVINS pDrvIns, PPDMTHREAD pThread));
185/** Pointer to a FNPDMTHREADDRV(). */
186typedef FNPDMTHREADWAKEUPDRV *PFNPDMTHREADWAKEUPDRV;
187
188/**
189 * PDM thread wakeup call, internal variation.
190 *
191 * @returns VBox status code.
192 * @param pVM The cross context VM structure.
193 * @param pThread The PDM thread data.
194 */
195typedef DECLCALLBACKTYPE(int, FNPDMTHREADWAKEUPINT,(PVM pVM, PPDMTHREAD pThread));
196/** Pointer to a FNPDMTHREADWAKEUPINT(). */
197typedef FNPDMTHREADWAKEUPINT *PFNPDMTHREADWAKEUPINT;
198
199/**
200 * PDM thread wakeup call, external variation.
201 *
202 * @returns VBox status code.
203 * @param pThread The PDM thread data.
204 */
205typedef int FNPDMTHREADWAKEUPEXT(PPDMTHREAD pThread);
206/** Pointer to a FNPDMTHREADEXT(). */
207typedef FNPDMTHREADWAKEUPEXT *PFNPDMTHREADWAKEUPEXT;
208
209
210/**
211 * PDM Thread instance data.
212 */
213typedef struct PDMTHREAD
214{
215 /** PDMTHREAD_VERSION. */
216 uint32_t u32Version;
217 /** The thread state. */
218 PDMTHREADSTATE volatile enmState;
219 /** The thread handle. */
220 RTTHREAD Thread;
221 /** The user parameter. */
222 R3PTRTYPE(void *) pvUser;
223 /** Data specific to the kind of thread.
224 * This should really be in PDMTHREADINT, but is placed here because of the
225 * function pointer typedefs. So, don't touch these, please.
226 */
227 union
228 {
229 /** PDMTHREADTYPE_DEVICE data. */
230 struct
231 {
232 /** The device instance. */
233 PPDMDEVINSR3 pDevIns;
234 /** The thread function. */
235 R3PTRTYPE(PFNPDMTHREADDEV) pfnThread;
236 /** Thread. */
237 R3PTRTYPE(PFNPDMTHREADWAKEUPDEV) pfnWakeUp;
238 } Dev;
239
240 /** PDMTHREADTYPE_USB data. */
241 struct
242 {
243 /** The device instance. */
244 PPDMUSBINS pUsbIns;
245 /** The thread function. */
246 R3PTRTYPE(PFNPDMTHREADUSB) pfnThread;
247 /** Thread. */
248 R3PTRTYPE(PFNPDMTHREADWAKEUPUSB) pfnWakeUp;
249 } Usb;
250
251 /** PDMTHREADTYPE_DRIVER data. */
252 struct
253 {
254 /** The driver instance. */
255 R3PTRTYPE(PPDMDRVINS) pDrvIns;
256 /** The thread function. */
257 R3PTRTYPE(PFNPDMTHREADDRV) pfnThread;
258 /** Thread. */
259 R3PTRTYPE(PFNPDMTHREADWAKEUPDRV) pfnWakeUp;
260 } Drv;
261
262 /** PDMTHREADTYPE_INTERNAL data. */
263 struct
264 {
265 /** The thread function. */
266 R3PTRTYPE(PFNPDMTHREADINT) pfnThread;
267 /** Thread. */
268 R3PTRTYPE(PFNPDMTHREADWAKEUPINT) pfnWakeUp;
269 } Int;
270
271 /** PDMTHREADTYPE_EXTERNAL data. */
272 struct
273 {
274 /** The thread function. */
275 R3PTRTYPE(PFNPDMTHREADEXT) pfnThread;
276 /** Thread. */
277 R3PTRTYPE(PFNPDMTHREADWAKEUPEXT) pfnWakeUp;
278 } Ext;
279 } u;
280
281 /** Internal data. */
282 union
283 {
284#ifdef PDMTHREADINT_DECLARED
285 PDMTHREADINT s;
286#endif
287 uint8_t padding[64];
288 } Internal;
289} PDMTHREAD;
290
291/** PDMTHREAD::u32Version value. */
292#define PDMTHREAD_VERSION PDM_VERSION_MAKE(0xefff, 1, 0)
293
294#ifdef IN_RING3
295VMMR3DECL(int) PDMR3ThreadCreate(PVM pVM, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread,
296 PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
297VMMR3DECL(int) PDMR3ThreadCreateExternal(PVM pVM, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread,
298 PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName);
299VMMR3DECL(int) PDMR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread);
300VMMR3DECL(int) PDMR3ThreadIAmSuspending(PPDMTHREAD pThread);
301VMMR3DECL(int) PDMR3ThreadIAmRunning(PPDMTHREAD pThread);
302VMMR3DECL(int) PDMR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies);
303VMMR3DECL(int) PDMR3ThreadSuspend(PPDMTHREAD pThread);
304VMMR3DECL(int) PDMR3ThreadResume(PPDMTHREAD pThread);
305#endif /* IN_RING3 */
306
307/** @} */
308
309RT_C_DECLS_END
310
311#endif /* !VBOX_INCLUDED_vmm_pdmthread_h */
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