]>
git.saurik.com Git - apple/xnu.git/blob - iokit/Kernel/IOLocks.cpp
f9940461e29bec42ce8e541e13f859674be8e8c7
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
30 #include <IOKit/system.h>
32 #include <IOKit/IOReturn.h>
33 #include <IOKit/IOLib.h>
34 #include <IOKit/assert.h>
37 #include <kern/simple_lock.h>
38 #include <machine/machine_routines.h>
40 IOLock
* IOLockAlloc( void )
42 return( mutex_alloc(ETAP_IO_AHA
) );
45 void IOLockFree( IOLock
* lock
)
50 void IOLockInitWithState( IOLock
* lock
, IOLockState state
)
52 mutex_init( lock
, ETAP_IO_AHA
);
54 if( state
== kIOLockStateLocked
)
58 struct _IORecursiveLock
{
64 IORecursiveLock
* IORecursiveLockAlloc( void )
66 _IORecursiveLock
* lock
;
68 lock
= IONew( _IORecursiveLock
, 1);
72 lock
->mutex
= mutex_alloc(ETAP_IO_AHA
);
77 IODelete( lock
, _IORecursiveLock
, 1);
81 return( (IORecursiveLock
*) lock
);
84 void IORecursiveLockFree( IORecursiveLock
* _lock
)
86 _IORecursiveLock
* lock
= (_IORecursiveLock
*)_lock
;
88 mutex_free( lock
->mutex
);
89 IODelete( lock
, _IORecursiveLock
, 1);
92 void IORecursiveLockLock( IORecursiveLock
* _lock
)
94 _IORecursiveLock
* lock
= (_IORecursiveLock
*)_lock
;
96 if( lock
->thread
== IOThreadSelf())
99 _mutex_lock( lock
->mutex
);
100 assert( lock
->thread
== 0 );
101 assert( lock
->count
== 0 );
102 lock
->thread
= IOThreadSelf();
107 boolean_t
IORecursiveLockTryLock( IORecursiveLock
* _lock
)
109 _IORecursiveLock
* lock
= (_IORecursiveLock
*)_lock
;
111 if( lock
->thread
== IOThreadSelf()) {
115 if( _mutex_try( lock
->mutex
)) {
116 assert( lock
->thread
== 0 );
117 assert( lock
->count
== 0 );
118 lock
->thread
= IOThreadSelf();
126 void IORecursiveLockUnlock( IORecursiveLock
* _lock
)
128 _IORecursiveLock
* lock
= (_IORecursiveLock
*)_lock
;
130 assert( lock
->thread
== IOThreadSelf() );
132 if( 0 == (--lock
->count
)) {
134 mutex_unlock( lock
->mutex
);
138 boolean_t
IORecursiveLockHaveLock( const IORecursiveLock
* _lock
)
140 _IORecursiveLock
* lock
= (_IORecursiveLock
*)_lock
;
142 return( lock
->thread
== IOThreadSelf());
145 int IORecursiveLockSleep(IORecursiveLock
*_lock
, void *event
, UInt32 interType
)
147 _IORecursiveLock
* lock
= (_IORecursiveLock
*)_lock
;
148 UInt32 count
= lock
->count
;
151 assert(lock
->thread
== IOThreadSelf());
152 assert(lock
->count
== 1 || interType
== THREAD_UNINT
);
154 assert_wait((event_t
) event
, (int) interType
);
157 mutex_unlock(lock
->mutex
);
159 res
= thread_block(0);
161 if (THREAD_AWAKENED
== res
) {
162 _mutex_lock(lock
->mutex
);
163 assert(lock
->thread
== 0);
164 assert(lock
->count
== 0);
165 lock
->thread
= IOThreadSelf();
172 void IORecursiveLockWakeup(IORecursiveLock
*, void *event
, bool oneThread
)
174 thread_wakeup_prim((event_t
) event
, oneThread
, THREAD_AWAKENED
);
178 * Complex (read/write) lock operations
181 IORWLock
* IORWLockAlloc( void )
185 lock
= lock_alloc( true, ETAP_IO_AHA
, ETAP_IO_AHA
);
190 void IORWLockFree( IORWLock
* lock
)
200 IOSimpleLock
* IOSimpleLockAlloc( void )
204 lock
= (IOSimpleLock
*) IOMalloc( sizeof(IOSimpleLock
));
206 IOSimpleLockInit( lock
);
211 void IOSimpleLockInit( IOSimpleLock
* lock
)
213 simple_lock_init( (simple_lock_t
) lock
, ETAP_IO_AHA
);
216 void IOSimpleLockFree( IOSimpleLock
* lock
)
218 IOFree( lock
, sizeof(IOSimpleLock
));