1*aca3beaaSApple OSS Distributions /*
2*aca3beaaSApple OSS Distributions * Copyright (c) 1998-2007 Apple Inc. All rights reserved.
3*aca3beaaSApple OSS Distributions *
4*aca3beaaSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*aca3beaaSApple OSS Distributions *
6*aca3beaaSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*aca3beaaSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*aca3beaaSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*aca3beaaSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*aca3beaaSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*aca3beaaSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*aca3beaaSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*aca3beaaSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*aca3beaaSApple OSS Distributions *
15*aca3beaaSApple OSS Distributions * Please obtain a copy of the License at
16*aca3beaaSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*aca3beaaSApple OSS Distributions *
18*aca3beaaSApple OSS Distributions * The Original Code and all software distributed under the License are
19*aca3beaaSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*aca3beaaSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*aca3beaaSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*aca3beaaSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*aca3beaaSApple OSS Distributions * Please see the License for the specific language governing rights and
24*aca3beaaSApple OSS Distributions * limitations under the License.
25*aca3beaaSApple OSS Distributions *
26*aca3beaaSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*aca3beaaSApple OSS Distributions */
28*aca3beaaSApple OSS Distributions
29*aca3beaaSApple OSS Distributions #include <IOKit/system.h>
30*aca3beaaSApple OSS Distributions
31*aca3beaaSApple OSS Distributions #include <IOKit/IOReturn.h>
32*aca3beaaSApple OSS Distributions #include <IOKit/IOLib.h>
33*aca3beaaSApple OSS Distributions #include <IOKit/assert.h>
34*aca3beaaSApple OSS Distributions
35*aca3beaaSApple OSS Distributions #include <IOKit/IOLocksPrivate.h>
36*aca3beaaSApple OSS Distributions
37*aca3beaaSApple OSS Distributions extern "C" {
38*aca3beaaSApple OSS Distributions #include <kern/locks.h>
39*aca3beaaSApple OSS Distributions
40*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
41*aca3beaaSApple OSS Distributions /* Synthetic event if none is specified, for backwards compatibility only. */
42*aca3beaaSApple OSS Distributions static bool IOLockSleep_NO_EVENT __attribute__((used)) = 0;
43*aca3beaaSApple OSS Distributions #endif
44*aca3beaaSApple OSS Distributions
45*aca3beaaSApple OSS Distributions void
IOLockInitWithState(IOLock * lock,IOLockState state)46*aca3beaaSApple OSS Distributions IOLockInitWithState( IOLock * lock, IOLockState state)
47*aca3beaaSApple OSS Distributions {
48*aca3beaaSApple OSS Distributions if (state == kIOLockStateLocked) {
49*aca3beaaSApple OSS Distributions lck_mtx_lock( lock);
50*aca3beaaSApple OSS Distributions }
51*aca3beaaSApple OSS Distributions }
52*aca3beaaSApple OSS Distributions
53*aca3beaaSApple OSS Distributions IOLock *
IOLockAlloc(void)54*aca3beaaSApple OSS Distributions IOLockAlloc( void )
55*aca3beaaSApple OSS Distributions {
56*aca3beaaSApple OSS Distributions return lck_mtx_alloc_init(IOLockGroup, LCK_ATTR_NULL);
57*aca3beaaSApple OSS Distributions }
58*aca3beaaSApple OSS Distributions
59*aca3beaaSApple OSS Distributions void
IOLockInlineInit(IOLock * lock)60*aca3beaaSApple OSS Distributions IOLockInlineInit( IOLock *lock )
61*aca3beaaSApple OSS Distributions {
62*aca3beaaSApple OSS Distributions lck_mtx_init(lock, IOLockGroup, LCK_ATTR_NULL);
63*aca3beaaSApple OSS Distributions }
64*aca3beaaSApple OSS Distributions
65*aca3beaaSApple OSS Distributions void
IOLockInlineDestroy(IOLock * lock)66*aca3beaaSApple OSS Distributions IOLockInlineDestroy( IOLock * lock)
67*aca3beaaSApple OSS Distributions {
68*aca3beaaSApple OSS Distributions lck_mtx_destroy( lock, IOLockGroup);
69*aca3beaaSApple OSS Distributions }
70*aca3beaaSApple OSS Distributions
71*aca3beaaSApple OSS Distributions void
IOLockFree(IOLock * lock)72*aca3beaaSApple OSS Distributions IOLockFree( IOLock * lock)
73*aca3beaaSApple OSS Distributions {
74*aca3beaaSApple OSS Distributions lck_mtx_free( lock, IOLockGroup);
75*aca3beaaSApple OSS Distributions }
76*aca3beaaSApple OSS Distributions
77*aca3beaaSApple OSS Distributions lck_mtx_t *
IOLockGetMachLock(IOLock * lock)78*aca3beaaSApple OSS Distributions IOLockGetMachLock( IOLock * lock)
79*aca3beaaSApple OSS Distributions {
80*aca3beaaSApple OSS Distributions return (lck_mtx_t *)lock;
81*aca3beaaSApple OSS Distributions }
82*aca3beaaSApple OSS Distributions
83*aca3beaaSApple OSS Distributions int
IOLockSleep(IOLock * lock,void * event,UInt32 interType)84*aca3beaaSApple OSS Distributions IOLockSleep( IOLock * lock, void *event, UInt32 interType)
85*aca3beaaSApple OSS Distributions {
86*aca3beaaSApple OSS Distributions return (int) lck_mtx_sleep(lock, LCK_SLEEP_PROMOTED_PRI, (event_t) event, (wait_interrupt_t) interType);
87*aca3beaaSApple OSS Distributions }
88*aca3beaaSApple OSS Distributions
89*aca3beaaSApple OSS Distributions int
IOLockSleepDeadline(IOLock * lock,void * event,AbsoluteTime deadline,UInt32 interType)90*aca3beaaSApple OSS Distributions IOLockSleepDeadline( IOLock * lock, void *event,
91*aca3beaaSApple OSS Distributions AbsoluteTime deadline, UInt32 interType)
92*aca3beaaSApple OSS Distributions {
93*aca3beaaSApple OSS Distributions return (int) lck_mtx_sleep_deadline(lock, LCK_SLEEP_PROMOTED_PRI, (event_t) event,
94*aca3beaaSApple OSS Distributions (wait_interrupt_t) interType, __OSAbsoluteTime(deadline));
95*aca3beaaSApple OSS Distributions }
96*aca3beaaSApple OSS Distributions
97*aca3beaaSApple OSS Distributions void
IOLockWakeup(IOLock * lock,void * event,bool oneThread)98*aca3beaaSApple OSS Distributions IOLockWakeup(IOLock * lock, void *event, bool oneThread)
99*aca3beaaSApple OSS Distributions {
100*aca3beaaSApple OSS Distributions thread_wakeup_prim((event_t) event, oneThread, THREAD_AWAKENED);
101*aca3beaaSApple OSS Distributions }
102*aca3beaaSApple OSS Distributions
103*aca3beaaSApple OSS Distributions
104*aca3beaaSApple OSS Distributions #if defined(__x86_64__)
105*aca3beaaSApple OSS Distributions /*
106*aca3beaaSApple OSS Distributions * For backwards compatibility, kexts built against pre-Darwin 14 headers will bind at runtime to this function,
107*aca3beaaSApple OSS Distributions * which supports a NULL event,
108*aca3beaaSApple OSS Distributions */
109*aca3beaaSApple OSS Distributions int IOLockSleep_legacy_x86_64( IOLock * lock, void *event, UInt32 interType) __asm("_IOLockSleep");
110*aca3beaaSApple OSS Distributions int IOLockSleepDeadline_legacy_x86_64( IOLock * lock, void *event,
111*aca3beaaSApple OSS Distributions AbsoluteTime deadline, UInt32 interType) __asm("_IOLockSleepDeadline");
112*aca3beaaSApple OSS Distributions void IOLockWakeup_legacy_x86_64(IOLock * lock, void *event, bool oneThread) __asm("_IOLockWakeup");
113*aca3beaaSApple OSS Distributions
114*aca3beaaSApple OSS Distributions int
IOLockSleep_legacy_x86_64(IOLock * lock,void * event,UInt32 interType)115*aca3beaaSApple OSS Distributions IOLockSleep_legacy_x86_64( IOLock * lock, void *event, UInt32 interType)
116*aca3beaaSApple OSS Distributions {
117*aca3beaaSApple OSS Distributions if (event == NULL) {
118*aca3beaaSApple OSS Distributions event = (void *)&IOLockSleep_NO_EVENT;
119*aca3beaaSApple OSS Distributions }
120*aca3beaaSApple OSS Distributions
121*aca3beaaSApple OSS Distributions return IOLockSleep(lock, event, interType);
122*aca3beaaSApple OSS Distributions }
123*aca3beaaSApple OSS Distributions
124*aca3beaaSApple OSS Distributions int
IOLockSleepDeadline_legacy_x86_64(IOLock * lock,void * event,AbsoluteTime deadline,UInt32 interType)125*aca3beaaSApple OSS Distributions IOLockSleepDeadline_legacy_x86_64( IOLock * lock, void *event,
126*aca3beaaSApple OSS Distributions AbsoluteTime deadline, UInt32 interType)
127*aca3beaaSApple OSS Distributions {
128*aca3beaaSApple OSS Distributions if (event == NULL) {
129*aca3beaaSApple OSS Distributions event = (void *)&IOLockSleep_NO_EVENT;
130*aca3beaaSApple OSS Distributions }
131*aca3beaaSApple OSS Distributions
132*aca3beaaSApple OSS Distributions return IOLockSleepDeadline(lock, event, deadline, interType);
133*aca3beaaSApple OSS Distributions }
134*aca3beaaSApple OSS Distributions
135*aca3beaaSApple OSS Distributions void
IOLockWakeup_legacy_x86_64(IOLock * lock,void * event,bool oneThread)136*aca3beaaSApple OSS Distributions IOLockWakeup_legacy_x86_64(IOLock * lock, void *event, bool oneThread)
137*aca3beaaSApple OSS Distributions {
138*aca3beaaSApple OSS Distributions if (event == NULL) {
139*aca3beaaSApple OSS Distributions event = (void *)&IOLockSleep_NO_EVENT;
140*aca3beaaSApple OSS Distributions }
141*aca3beaaSApple OSS Distributions
142*aca3beaaSApple OSS Distributions IOLockWakeup(lock, event, oneThread);
143*aca3beaaSApple OSS Distributions }
144*aca3beaaSApple OSS Distributions #endif /* defined(__x86_64__) */
145*aca3beaaSApple OSS Distributions
146*aca3beaaSApple OSS Distributions
147*aca3beaaSApple OSS Distributions struct _IORecursiveLock {
148*aca3beaaSApple OSS Distributions lck_mtx_t mutex;
149*aca3beaaSApple OSS Distributions lck_grp_t *group;
150*aca3beaaSApple OSS Distributions thread_t thread;
151*aca3beaaSApple OSS Distributions UInt32 count;
152*aca3beaaSApple OSS Distributions };
153*aca3beaaSApple OSS Distributions
154*aca3beaaSApple OSS Distributions IORecursiveLock *
IORecursiveLockAllocWithLockGroup(lck_grp_t * lockGroup)155*aca3beaaSApple OSS Distributions IORecursiveLockAllocWithLockGroup( lck_grp_t * lockGroup )
156*aca3beaaSApple OSS Distributions {
157*aca3beaaSApple OSS Distributions _IORecursiveLock * lock;
158*aca3beaaSApple OSS Distributions
159*aca3beaaSApple OSS Distributions if (lockGroup == NULL) {
160*aca3beaaSApple OSS Distributions return NULL;
161*aca3beaaSApple OSS Distributions }
162*aca3beaaSApple OSS Distributions
163*aca3beaaSApple OSS Distributions lock = IOMallocType( _IORecursiveLock );
164*aca3beaaSApple OSS Distributions if (!lock) {
165*aca3beaaSApple OSS Distributions return NULL;
166*aca3beaaSApple OSS Distributions }
167*aca3beaaSApple OSS Distributions
168*aca3beaaSApple OSS Distributions lck_mtx_init( &lock->mutex, lockGroup, LCK_ATTR_NULL );
169*aca3beaaSApple OSS Distributions lock->group = lockGroup;
170*aca3beaaSApple OSS Distributions lock->thread = NULL;
171*aca3beaaSApple OSS Distributions lock->count = 0;
172*aca3beaaSApple OSS Distributions
173*aca3beaaSApple OSS Distributions return (IORecursiveLock *) lock;
174*aca3beaaSApple OSS Distributions }
175*aca3beaaSApple OSS Distributions
176*aca3beaaSApple OSS Distributions
177*aca3beaaSApple OSS Distributions IORecursiveLock *
IORecursiveLockAlloc(void)178*aca3beaaSApple OSS Distributions IORecursiveLockAlloc( void )
179*aca3beaaSApple OSS Distributions {
180*aca3beaaSApple OSS Distributions return IORecursiveLockAllocWithLockGroup( IOLockGroup );
181*aca3beaaSApple OSS Distributions }
182*aca3beaaSApple OSS Distributions
183*aca3beaaSApple OSS Distributions void
IORecursiveLockFree(IORecursiveLock * _lock)184*aca3beaaSApple OSS Distributions IORecursiveLockFree( IORecursiveLock * _lock )
185*aca3beaaSApple OSS Distributions {
186*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
187*aca3beaaSApple OSS Distributions
188*aca3beaaSApple OSS Distributions lck_mtx_destroy(&lock->mutex, lock->group);
189*aca3beaaSApple OSS Distributions IOFreeType( lock, _IORecursiveLock );
190*aca3beaaSApple OSS Distributions }
191*aca3beaaSApple OSS Distributions
192*aca3beaaSApple OSS Distributions lck_mtx_t *
IORecursiveLockGetMachLock(IORecursiveLock * lock)193*aca3beaaSApple OSS Distributions IORecursiveLockGetMachLock( IORecursiveLock * lock )
194*aca3beaaSApple OSS Distributions {
195*aca3beaaSApple OSS Distributions return &lock->mutex;
196*aca3beaaSApple OSS Distributions }
197*aca3beaaSApple OSS Distributions
198*aca3beaaSApple OSS Distributions void
IORecursiveLockLock(IORecursiveLock * _lock)199*aca3beaaSApple OSS Distributions IORecursiveLockLock( IORecursiveLock * _lock)
200*aca3beaaSApple OSS Distributions {
201*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
202*aca3beaaSApple OSS Distributions
203*aca3beaaSApple OSS Distributions if (lock->thread == IOThreadSelf()) {
204*aca3beaaSApple OSS Distributions lock->count++;
205*aca3beaaSApple OSS Distributions } else {
206*aca3beaaSApple OSS Distributions lck_mtx_lock( &lock->mutex );
207*aca3beaaSApple OSS Distributions assert( lock->thread == NULL );
208*aca3beaaSApple OSS Distributions assert( lock->count == 0 );
209*aca3beaaSApple OSS Distributions lock->thread = IOThreadSelf();
210*aca3beaaSApple OSS Distributions lock->count = 1;
211*aca3beaaSApple OSS Distributions }
212*aca3beaaSApple OSS Distributions }
213*aca3beaaSApple OSS Distributions
214*aca3beaaSApple OSS Distributions boolean_t
IORecursiveLockTryLock(IORecursiveLock * _lock)215*aca3beaaSApple OSS Distributions IORecursiveLockTryLock( IORecursiveLock * _lock)
216*aca3beaaSApple OSS Distributions {
217*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
218*aca3beaaSApple OSS Distributions
219*aca3beaaSApple OSS Distributions if (lock->thread == IOThreadSelf()) {
220*aca3beaaSApple OSS Distributions lock->count++;
221*aca3beaaSApple OSS Distributions return true;
222*aca3beaaSApple OSS Distributions } else {
223*aca3beaaSApple OSS Distributions if (lck_mtx_try_lock( &lock->mutex )) {
224*aca3beaaSApple OSS Distributions assert( lock->thread == NULL );
225*aca3beaaSApple OSS Distributions assert( lock->count == 0 );
226*aca3beaaSApple OSS Distributions lock->thread = IOThreadSelf();
227*aca3beaaSApple OSS Distributions lock->count = 1;
228*aca3beaaSApple OSS Distributions return true;
229*aca3beaaSApple OSS Distributions }
230*aca3beaaSApple OSS Distributions }
231*aca3beaaSApple OSS Distributions return false;
232*aca3beaaSApple OSS Distributions }
233*aca3beaaSApple OSS Distributions
234*aca3beaaSApple OSS Distributions void
IORecursiveLockUnlock(IORecursiveLock * _lock)235*aca3beaaSApple OSS Distributions IORecursiveLockUnlock( IORecursiveLock * _lock)
236*aca3beaaSApple OSS Distributions {
237*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
238*aca3beaaSApple OSS Distributions
239*aca3beaaSApple OSS Distributions assert( lock->thread == IOThreadSelf());
240*aca3beaaSApple OSS Distributions
241*aca3beaaSApple OSS Distributions if (0 == (--lock->count)) {
242*aca3beaaSApple OSS Distributions lock->thread = NULL;
243*aca3beaaSApple OSS Distributions lck_mtx_unlock( &lock->mutex );
244*aca3beaaSApple OSS Distributions }
245*aca3beaaSApple OSS Distributions }
246*aca3beaaSApple OSS Distributions
247*aca3beaaSApple OSS Distributions boolean_t
IORecursiveLockHaveLock(const IORecursiveLock * _lock)248*aca3beaaSApple OSS Distributions IORecursiveLockHaveLock( const IORecursiveLock * _lock)
249*aca3beaaSApple OSS Distributions {
250*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
251*aca3beaaSApple OSS Distributions
252*aca3beaaSApple OSS Distributions return lock->thread == IOThreadSelf();
253*aca3beaaSApple OSS Distributions }
254*aca3beaaSApple OSS Distributions
255*aca3beaaSApple OSS Distributions int
IORecursiveLockSleep(IORecursiveLock * _lock,void * event,UInt32 interType)256*aca3beaaSApple OSS Distributions IORecursiveLockSleep(IORecursiveLock *_lock, void *event, UInt32 interType)
257*aca3beaaSApple OSS Distributions {
258*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
259*aca3beaaSApple OSS Distributions UInt32 count = lock->count;
260*aca3beaaSApple OSS Distributions int res;
261*aca3beaaSApple OSS Distributions
262*aca3beaaSApple OSS Distributions assert(lock->thread == IOThreadSelf());
263*aca3beaaSApple OSS Distributions
264*aca3beaaSApple OSS Distributions lock->count = 0;
265*aca3beaaSApple OSS Distributions lock->thread = NULL;
266*aca3beaaSApple OSS Distributions res = lck_mtx_sleep(&lock->mutex, LCK_SLEEP_PROMOTED_PRI, (event_t) event, (wait_interrupt_t) interType);
267*aca3beaaSApple OSS Distributions
268*aca3beaaSApple OSS Distributions // Must re-establish the recursive lock no matter why we woke up
269*aca3beaaSApple OSS Distributions // otherwise we would potentially leave the return path corrupted.
270*aca3beaaSApple OSS Distributions assert(lock->thread == NULL);
271*aca3beaaSApple OSS Distributions assert(lock->count == 0);
272*aca3beaaSApple OSS Distributions lock->thread = IOThreadSelf();
273*aca3beaaSApple OSS Distributions lock->count = count;
274*aca3beaaSApple OSS Distributions return res;
275*aca3beaaSApple OSS Distributions }
276*aca3beaaSApple OSS Distributions
277*aca3beaaSApple OSS Distributions int
IORecursiveLockSleepDeadline(IORecursiveLock * _lock,void * event,AbsoluteTime deadline,UInt32 interType)278*aca3beaaSApple OSS Distributions IORecursiveLockSleepDeadline( IORecursiveLock * _lock, void *event,
279*aca3beaaSApple OSS Distributions AbsoluteTime deadline, UInt32 interType)
280*aca3beaaSApple OSS Distributions {
281*aca3beaaSApple OSS Distributions _IORecursiveLock * lock = (_IORecursiveLock *)_lock;
282*aca3beaaSApple OSS Distributions UInt32 count = lock->count;
283*aca3beaaSApple OSS Distributions int res;
284*aca3beaaSApple OSS Distributions
285*aca3beaaSApple OSS Distributions assert(lock->thread == IOThreadSelf());
286*aca3beaaSApple OSS Distributions
287*aca3beaaSApple OSS Distributions lock->count = 0;
288*aca3beaaSApple OSS Distributions lock->thread = NULL;
289*aca3beaaSApple OSS Distributions res = lck_mtx_sleep_deadline(&lock->mutex, LCK_SLEEP_PROMOTED_PRI, (event_t) event,
290*aca3beaaSApple OSS Distributions (wait_interrupt_t) interType, __OSAbsoluteTime(deadline));
291*aca3beaaSApple OSS Distributions
292*aca3beaaSApple OSS Distributions // Must re-establish the recursive lock no matter why we woke up
293*aca3beaaSApple OSS Distributions // otherwise we would potentially leave the return path corrupted.
294*aca3beaaSApple OSS Distributions assert(lock->thread == NULL);
295*aca3beaaSApple OSS Distributions assert(lock->count == 0);
296*aca3beaaSApple OSS Distributions lock->thread = IOThreadSelf();
297*aca3beaaSApple OSS Distributions lock->count = count;
298*aca3beaaSApple OSS Distributions return res;
299*aca3beaaSApple OSS Distributions }
300*aca3beaaSApple OSS Distributions
301*aca3beaaSApple OSS Distributions void
IORecursiveLockWakeup(IORecursiveLock *,void * event,bool oneThread)302*aca3beaaSApple OSS Distributions IORecursiveLockWakeup(IORecursiveLock *, void *event, bool oneThread)
303*aca3beaaSApple OSS Distributions {
304*aca3beaaSApple OSS Distributions thread_wakeup_prim((event_t) event, oneThread, THREAD_AWAKENED);
305*aca3beaaSApple OSS Distributions }
306*aca3beaaSApple OSS Distributions
307*aca3beaaSApple OSS Distributions /*
308*aca3beaaSApple OSS Distributions * Complex (read/write) lock operations
309*aca3beaaSApple OSS Distributions */
310*aca3beaaSApple OSS Distributions
311*aca3beaaSApple OSS Distributions IORWLock *
IORWLockAlloc(void)312*aca3beaaSApple OSS Distributions IORWLockAlloc( void )
313*aca3beaaSApple OSS Distributions {
314*aca3beaaSApple OSS Distributions return lck_rw_alloc_init(IOLockGroup, LCK_ATTR_NULL);
315*aca3beaaSApple OSS Distributions }
316*aca3beaaSApple OSS Distributions
317*aca3beaaSApple OSS Distributions void
IORWLockInlineInit(IORWLock * lock)318*aca3beaaSApple OSS Distributions IORWLockInlineInit( IORWLock *lock )
319*aca3beaaSApple OSS Distributions {
320*aca3beaaSApple OSS Distributions lck_rw_init(lock, IOLockGroup, LCK_ATTR_NULL);
321*aca3beaaSApple OSS Distributions }
322*aca3beaaSApple OSS Distributions
323*aca3beaaSApple OSS Distributions void
IORWLockInlineDestroy(IORWLock * lock)324*aca3beaaSApple OSS Distributions IORWLockInlineDestroy( IORWLock * lock)
325*aca3beaaSApple OSS Distributions {
326*aca3beaaSApple OSS Distributions lck_rw_destroy( lock, IOLockGroup);
327*aca3beaaSApple OSS Distributions }
328*aca3beaaSApple OSS Distributions
329*aca3beaaSApple OSS Distributions void
IORWLockFree(IORWLock * lock)330*aca3beaaSApple OSS Distributions IORWLockFree( IORWLock * lock)
331*aca3beaaSApple OSS Distributions {
332*aca3beaaSApple OSS Distributions lck_rw_free( lock, IOLockGroup);
333*aca3beaaSApple OSS Distributions }
334*aca3beaaSApple OSS Distributions
335*aca3beaaSApple OSS Distributions lck_rw_t *
IORWLockGetMachLock(IORWLock * lock)336*aca3beaaSApple OSS Distributions IORWLockGetMachLock( IORWLock * lock)
337*aca3beaaSApple OSS Distributions {
338*aca3beaaSApple OSS Distributions return (lck_rw_t *)lock;
339*aca3beaaSApple OSS Distributions }
340*aca3beaaSApple OSS Distributions
341*aca3beaaSApple OSS Distributions
342*aca3beaaSApple OSS Distributions /*
343*aca3beaaSApple OSS Distributions * Spin locks
344*aca3beaaSApple OSS Distributions */
345*aca3beaaSApple OSS Distributions
346*aca3beaaSApple OSS Distributions IOSimpleLock *
IOSimpleLockAlloc(void)347*aca3beaaSApple OSS Distributions IOSimpleLockAlloc( void )
348*aca3beaaSApple OSS Distributions {
349*aca3beaaSApple OSS Distributions return lck_spin_alloc_init( IOLockGroup, LCK_ATTR_NULL);
350*aca3beaaSApple OSS Distributions }
351*aca3beaaSApple OSS Distributions
352*aca3beaaSApple OSS Distributions void
IOSimpleLockInit(IOSimpleLock * lock)353*aca3beaaSApple OSS Distributions IOSimpleLockInit( IOSimpleLock * lock)
354*aca3beaaSApple OSS Distributions {
355*aca3beaaSApple OSS Distributions lck_spin_init( lock, IOLockGroup, LCK_ATTR_NULL);
356*aca3beaaSApple OSS Distributions }
357*aca3beaaSApple OSS Distributions
358*aca3beaaSApple OSS Distributions void
IOSimpleLockDestroy(IOSimpleLock * lock)359*aca3beaaSApple OSS Distributions IOSimpleLockDestroy( IOSimpleLock * lock )
360*aca3beaaSApple OSS Distributions {
361*aca3beaaSApple OSS Distributions lck_spin_destroy(lock, IOLockGroup);
362*aca3beaaSApple OSS Distributions }
363*aca3beaaSApple OSS Distributions
364*aca3beaaSApple OSS Distributions void
IOSimpleLockFree(IOSimpleLock * lock)365*aca3beaaSApple OSS Distributions IOSimpleLockFree( IOSimpleLock * lock )
366*aca3beaaSApple OSS Distributions {
367*aca3beaaSApple OSS Distributions lck_spin_free( lock, IOLockGroup);
368*aca3beaaSApple OSS Distributions }
369*aca3beaaSApple OSS Distributions
370*aca3beaaSApple OSS Distributions lck_spin_t *
IOSimpleLockGetMachLock(IOSimpleLock * lock)371*aca3beaaSApple OSS Distributions IOSimpleLockGetMachLock( IOSimpleLock * lock)
372*aca3beaaSApple OSS Distributions {
373*aca3beaaSApple OSS Distributions return (lck_spin_t *)lock;
374*aca3beaaSApple OSS Distributions }
375*aca3beaaSApple OSS Distributions
376*aca3beaaSApple OSS Distributions #ifndef IOLOCKS_INLINE
377*aca3beaaSApple OSS Distributions /*
378*aca3beaaSApple OSS Distributions * Lock assertions
379*aca3beaaSApple OSS Distributions */
380*aca3beaaSApple OSS Distributions
381*aca3beaaSApple OSS Distributions void
IOLockAssert(IOLock * lock,IOLockAssertState type)382*aca3beaaSApple OSS Distributions IOLockAssert(IOLock * lock, IOLockAssertState type)
383*aca3beaaSApple OSS Distributions {
384*aca3beaaSApple OSS Distributions LCK_MTX_ASSERT(lock, type);
385*aca3beaaSApple OSS Distributions }
386*aca3beaaSApple OSS Distributions
387*aca3beaaSApple OSS Distributions void
IORWLockAssert(IORWLock * lock,IORWLockAssertState type)388*aca3beaaSApple OSS Distributions IORWLockAssert(IORWLock * lock, IORWLockAssertState type)
389*aca3beaaSApple OSS Distributions {
390*aca3beaaSApple OSS Distributions LCK_RW_ASSERT(lock, type);
391*aca3beaaSApple OSS Distributions }
392*aca3beaaSApple OSS Distributions
393*aca3beaaSApple OSS Distributions void
IOSimpleLockAssert(IOSimpleLock * lock,IOSimpleLockAssertState type)394*aca3beaaSApple OSS Distributions IOSimpleLockAssert(IOSimpleLock *lock, IOSimpleLockAssertState type)
395*aca3beaaSApple OSS Distributions {
396*aca3beaaSApple OSS Distributions LCK_SPIN_ASSERT(l, type);
397*aca3beaaSApple OSS Distributions }
398*aca3beaaSApple OSS Distributions #endif /* !IOLOCKS_INLINE */
399*aca3beaaSApple OSS Distributions } /* extern "C" */
400