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