VirtualBox

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

Last change on this file since 1890 was 659, checked in by vboxsync, 18 years ago

Freebsd keep count of spinlock enter/exits on a per thread basis, so it'll join OS/2 with a dummy tmp variable.

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