1 /*****************************************************************************/
4 * \brief Simple lock implementation.
5 * Does only work if all thread have the same priority!
8 * \author Michael Hohmuth <hohmuth@os.inf.tu-dresden.de> */
10 * (c) 2000-2009 Author(s)
11 * economic rights: Technische Universität Dresden (Germany)
12 * This file is part of TUD:OS and distributed under the terms of the
13 * GNU Lesser General Public License 2.1.
14 * Please see the COPYING-LGPL-2.1 file for details.
17 /*****************************************************************************/
18 #ifndef __L4UTIL_LOCK_H__
19 #define __L4UTIL_LOCK_H__
21 #include <l4/sys/thread.h>
22 #include <l4/sys/compiler.h>
23 #include <l4/util/atomic.h>
27 typedef l4_uint32_t l4util_simple_lock_t;
29 L4_INLINE int l4_simple_try_lock(l4util_simple_lock_t *lock);
30 L4_INLINE void l4_simple_unlock(l4util_simple_lock_t *lock);
31 L4_INLINE int l4_simple_lock_locked(l4util_simple_lock_t *lock);
32 L4_INLINE void l4_simple_lock_solid(register l4util_simple_lock_t *p);
33 L4_INLINE void l4_simple_lock(l4util_simple_lock_t * lock);
36 l4_simple_try_lock(l4util_simple_lock_t *lock)
38 return l4util_xchg32(lock, 1) == 0;
42 l4_simple_unlock(l4util_simple_lock_t *lock)
48 l4_simple_lock_locked(l4util_simple_lock_t *lock)
50 return (*lock == 0) ? 0 : 1;
54 l4_simple_lock_solid(register l4util_simple_lock_t *p)
56 while (l4_simple_lock_locked(p) || !l4_simple_try_lock(p))
57 l4_thread_switch(L4_INVALID_CAP);
61 l4_simple_lock(l4util_simple_lock_t * lock)
63 if (!l4_simple_try_lock(lock))
64 l4_simple_lock_solid(lock);