VirtualBox

source: vbox/trunk/include/iprt/spinlock.h@ 129

Last change on this file since 129 was 1, checked in by vboxsync, 55 years ago

import

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.9 KB
Line 
1/** @file
2 *
3 * InnoTek Portable Runtime - Spinlocks.
4 */
5
6/*
7 * Copyright (C) 2006 InnoTek Systemberatung 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#ifndef __iprt_spinlock_h__
23#define __iprt_spinlock_h__
24
25#include <iprt/cdefs.h>
26#include <iprt/types.h>
27
28__BEGIN_DECLS
29
30
31/** @defgroup grp_rt_spinlock RTSpinlock - Spinlocks
32 * @ingroup grp_rt
33 * @{
34 */
35
36/**
37 * Temporary spinlock state variable.
38 * All members are undefined and highly platform specific.
39 */
40typedef struct RTSPINLOCKTMP
41{
42#ifdef IN_RING0
43# ifdef __LINUX__
44 /** The saved [R|E]FLAGS. */
45 unsigned long flFlags;
46# define RTSPINLOCKTMP_INITIALIZER { 0 }
47
48# elif defined(__WIN__)
49 /** The saved [R|E]FLAGS. */
50 RTUINTREG uFlags;
51 /** The KIRQL. */
52 unsigned char uchIrqL;
53# define RTSPINLOCKTMP_INITIALIZER { 0, 0 }
54
55# elif defined(__L4__)
56 /** The saved [R|E]FLAGS. */
57 unsigned long flFlags;
58# define RTSPINLOCKTMP_INITIALIZER { 0 }
59
60# elif defined(__DARWIN__)
61 /** The saved [R|E]FLAGS. */
62 RTUINTREG uFlags;
63# define RTSPINLOCKTMP_INITIALIZER { 0 }
64
65# elif defined(__OS2__)
66 /** The saved [R|E]FLAGS. (dummy) */
67 RTUINTREG uFlags;
68# define RTSPINLOCKTMP_INITIALIZER { 0 }
69
70# else
71# error "Your OS is not supported.\n"
72 /** The saved [R|E]FLAGS. */
73 RTUINTREG uFlags;
74# endif
75
76#else /* !IN_RING0 */
77 /** The saved [R|E]FLAGS.
78 * (RT spinlocks will by definition disable interrupts.) */
79 RTUINTREG uFlags;
80# define RTSPINLOCKTMP_INITIALIZER { 0 }
81#endif /* !IN_RING0 */
82} RTSPINLOCKTMP;
83/** Pointer to a temporary spinlock state variable. */
84typedef RTSPINLOCKTMP *PRTSPINLOCKTMP;
85/** Pointer to a const temporary spinlock state variable. */
86typedef const RTSPINLOCKTMP *PCRTSPINLOCKTMP;
87
88/** @def RTSPINLOCKTMP_INITIALIZER
89 * What to assign to a RTSPINLOCKTMP at definition.
90 */
91#ifdef __DOXYGEN__
92# define RTSPINLOCKTMP_INITIALIZER
93#endif
94
95
96
97/**
98 * Creates a spinlock.
99 *
100 * @returns iprt status code.
101 * @param pSpinlock Where to store the spinlock handle.
102 */
103RTDECL(int) RTSpinlockCreate(PRTSPINLOCK pSpinlock);
104
105/**
106 * Destroys a spinlock created by RTSpinlockCreate().
107 *
108 * @returns iprt status code.
109 * @param Spinlock Spinlock returned by RTSpinlockCreate().
110 */
111RTDECL(int) RTSpinlockDestroy(RTSPINLOCK Spinlock);
112
113/**
114 * Acquires the spinlock.
115 * Interrupts are disabled upon return.
116 *
117 * @param Spinlock The spinlock to acquire.
118 * @param pTmp Where to save the state.
119 */
120RTDECL(void) RTSpinlockAcquireNoInts(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
121
122/**
123 * Releases the spinlock.
124 *
125 * @param Spinlock The spinlock to acquire.
126 * @param pTmp The state to restore. (This better be the same as for the RTSpinlockAcquire() call!)
127 */
128RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
129
130/**
131 * Acquires the spinlock.
132 *
133 * @param Spinlock The spinlock to acquire.
134 * @param pTmp Where to save the state.
135 */
136RTDECL(void) RTSpinlockAcquire(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
137
138/**
139 * Releases the spinlock.
140 *
141 * @param Spinlock The spinlock to acquire.
142 * @param pTmp The state to restore. (This better be the same as for the RTSpinlockAcquire() call!)
143 */
144RTDECL(void) RTSpinlockRelease(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
145
146
147/** @} */
148
149__END_DECLS
150
151#endif
152
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