VirtualBox

source: vbox/trunk/include/VBox/vmm/pdmcritsect.h@ 82261

Last change on this file since 82261 was 80673, checked in by vboxsync, 5 years ago

PDM/DevHlp: Need to wrap the crit sect methods so we can pass on pVM to the crit sect code later, as we won't be able to sore pointers in the internal critical section data anymore. bugref:9218

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 4.1 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, Critical Sections.
3 */
4
5/*
6 * Copyright (C) 2006-2019 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef VBOX_INCLUDED_vmm_pdmcritsect_h
27#define VBOX_INCLUDED_vmm_pdmcritsect_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32#include <VBox/types.h>
33#include <iprt/critsect.h>
34
35
36RT_C_DECLS_BEGIN
37
38/** @defgroup grp_pdm_critsect The PDM Critical Section API
39 * @ingroup grp_pdm
40 * @{
41 */
42
43/**
44 * A PDM critical section.
45 * Initialize using PDMDRVHLP::pfnCritSectInit().
46 */
47typedef union PDMCRITSECT
48{
49 /** Padding. */
50 uint8_t padding[HC_ARCH_BITS == 32 ? 0x80 : 0xc0];
51#ifdef PDMCRITSECTINT_DECLARED
52 /** The internal structure (not normally visible). */
53 struct PDMCRITSECTINT s;
54#endif
55} PDMCRITSECT;
56
57VMMR3_INT_DECL(int) PDMR3CritSectBothTerm(PVM pVM);
58VMMR3_INT_DECL(void) PDMR3CritSectLeaveAll(PVM pVM);
59VMM_INT_DECL(void) PDMCritSectBothFF(PVMCPUCC pVCpu);
60
61
62VMMR3DECL(uint32_t) PDMR3CritSectCountOwned(PVM pVM, char *pszNames, size_t cbNames);
63
64VMMR3DECL(int) PDMR3CritSectInit(PVM pVM, PPDMCRITSECT pCritSect, RT_SRC_POS_DECL,
65 const char *pszNameFmt, ...) RT_IPRT_FORMAT_ATTR(6, 7);
66VMMR3DECL(int) PDMR3CritSectEnterEx(PPDMCRITSECT pCritSect, bool fCallRing3);
67VMMR3DECL(bool) PDMR3CritSectYield(PVM pVM, PPDMCRITSECT pCritSect);
68VMMR3DECL(const char *) PDMR3CritSectName(PCPDMCRITSECT pCritSect);
69VMMR3DECL(int) PDMR3CritSectDelete(PPDMCRITSECT pCritSect);
70#if defined(IN_RING0) || defined(IN_RING3)
71VMMDECL(int) PDMHCCritSectScheduleExitEvent(PPDMCRITSECT pCritSect, SUPSEMEVENT hEventToSignal);
72#endif
73
74VMMDECL(int) PDMCritSectEnter(PPDMCRITSECT pCritSect, int rcBusy);
75VMMDECL(int) PDMCritSectEnterDebug(PPDMCRITSECT pCritSect, int rcBusy, RTHCUINTPTR uId, RT_SRC_POS_DECL);
76VMMDECL(int) PDMCritSectTryEnter(PPDMCRITSECT pCritSect);
77VMMDECL(int) PDMCritSectTryEnterDebug(PPDMCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL);
78VMMDECL(int) PDMCritSectLeave(PPDMCRITSECT pCritSect);
79
80VMMDECL(bool) PDMCritSectIsOwner(PCPDMCRITSECT pCritSect);
81VMMDECL(bool) PDMCritSectIsOwnerEx(PCPDMCRITSECT pCritSect, PVMCPUCC pVCpu);
82VMMDECL(bool) PDMCritSectIsInitialized(PCPDMCRITSECT pCritSect);
83VMMDECL(bool) PDMCritSectHasWaiters(PCPDMCRITSECT pCritSect);
84VMMDECL(uint32_t) PDMCritSectGetRecursion(PCPDMCRITSECT pCritSect);
85
86VMMR3DECL(PPDMCRITSECT) PDMR3CritSectGetNop(PVM pVM);
87VMMR3DECL(R0PTRTYPE(PPDMCRITSECT)) PDMR3CritSectGetNopR0(PVM pVM);
88VMMR3DECL(RCPTRTYPE(PPDMCRITSECT)) PDMR3CritSectGetNopRC(PVM pVM);
89
90/* Strict build: Remap the two enter calls to the debug versions. */
91#ifdef VBOX_STRICT
92# ifdef IPRT_INCLUDED_asm_h
93# define PDMCritSectEnter(pCritSect, rcBusy) PDMCritSectEnterDebug((pCritSect), (rcBusy), (uintptr_t)ASMReturnAddress(), RT_SRC_POS)
94# define PDMCritSectTryEnter(pCritSect) PDMCritSectTryEnterDebug((pCritSect), (uintptr_t)ASMReturnAddress(), RT_SRC_POS)
95# else
96# define PDMCritSectEnter(pCritSect, rcBusy) PDMCritSectEnterDebug((pCritSect), (rcBusy), 0, RT_SRC_POS)
97# define PDMCritSectTryEnter(pCritSect) PDMCritSectTryEnterDebug((pCritSect), 0, RT_SRC_POS)
98# endif
99#endif
100
101/** @} */
102
103RT_C_DECLS_END
104
105#endif /* !VBOX_INCLUDED_vmm_pdmcritsect_h */
106
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