forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Core functions for the rt-mutex subsystem. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
- Loading branch information
Ingo Molnar
authored and
Linus Torvalds
committed
Jun 28, 2006
1 parent
b29739f
commit 23f78d4
Showing
11 changed files
with
1,181 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* | ||
* RT Mutexes: blocking mutual exclusion locks with PI support | ||
* | ||
* started by Ingo Molnar and Thomas Gleixner: | ||
* | ||
* Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | ||
* Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com> | ||
* | ||
* This file contains the public data structure and API definitions. | ||
*/ | ||
|
||
#ifndef __LINUX_RT_MUTEX_H | ||
#define __LINUX_RT_MUTEX_H | ||
|
||
#include <linux/linkage.h> | ||
#include <linux/plist.h> | ||
#include <linux/spinlock_types.h> | ||
|
||
/* | ||
* The rt_mutex structure | ||
* | ||
* @wait_lock: spinlock to protect the structure | ||
* @wait_list: pilist head to enqueue waiters in priority order | ||
* @owner: the mutex owner | ||
*/ | ||
struct rt_mutex { | ||
spinlock_t wait_lock; | ||
struct plist_head wait_list; | ||
struct task_struct *owner; | ||
#ifdef CONFIG_DEBUG_RT_MUTEXES | ||
int save_state; | ||
struct list_head held_list_entry; | ||
unsigned long acquire_ip; | ||
const char *name, *file; | ||
int line; | ||
void *magic; | ||
#endif | ||
}; | ||
|
||
struct rt_mutex_waiter; | ||
struct hrtimer_sleeper; | ||
|
||
#ifdef CONFIG_DEBUG_RT_MUTEXES | ||
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ | ||
, .name = #mutexname, .file = __FILE__, .line = __LINE__ | ||
# define rt_mutex_init(mutex) __rt_mutex_init(mutex, __FUNCTION__) | ||
extern void rt_mutex_debug_task_free(struct task_struct *tsk); | ||
#else | ||
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) | ||
# define rt_mutex_init(mutex) __rt_mutex_init(mutex, NULL) | ||
# define rt_mutex_debug_task_free(t) do { } while (0) | ||
#endif | ||
|
||
#define __RT_MUTEX_INITIALIZER(mutexname) \ | ||
{ .wait_lock = SPIN_LOCK_UNLOCKED \ | ||
, .wait_list = PLIST_HEAD_INIT(mutexname.wait_list, mutexname.wait_lock) \ | ||
, .owner = NULL \ | ||
__DEBUG_RT_MUTEX_INITIALIZER(mutexname)} | ||
|
||
#define DEFINE_RT_MUTEX(mutexname) \ | ||
struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) | ||
|
||
/*** | ||
* rt_mutex_is_locked - is the mutex locked | ||
* @lock: the mutex to be queried | ||
* | ||
* Returns 1 if the mutex is locked, 0 if unlocked. | ||
*/ | ||
static inline int rt_mutex_is_locked(struct rt_mutex *lock) | ||
{ | ||
return lock->owner != NULL; | ||
} | ||
|
||
extern void __rt_mutex_init(struct rt_mutex *lock, const char *name); | ||
extern void rt_mutex_destroy(struct rt_mutex *lock); | ||
|
||
extern void rt_mutex_lock(struct rt_mutex *lock); | ||
extern int rt_mutex_lock_interruptible(struct rt_mutex *lock, | ||
int detect_deadlock); | ||
extern int rt_mutex_timed_lock(struct rt_mutex *lock, | ||
struct hrtimer_sleeper *timeout, | ||
int detect_deadlock); | ||
|
||
extern int rt_mutex_trylock(struct rt_mutex *lock); | ||
|
||
extern void rt_mutex_unlock(struct rt_mutex *lock); | ||
|
||
#ifdef CONFIG_DEBUG_RT_MUTEXES | ||
# define INIT_RT_MUTEX_DEBUG(tsk) \ | ||
.held_list_head = LIST_HEAD_INIT(tsk.held_list_head), \ | ||
.held_list_lock = SPIN_LOCK_UNLOCKED | ||
#else | ||
# define INIT_RT_MUTEX_DEBUG(tsk) | ||
#endif | ||
|
||
#ifdef CONFIG_RT_MUTEXES | ||
# define INIT_RT_MUTEXES(tsk) \ | ||
.pi_waiters = PLIST_HEAD_INIT(tsk.pi_waiters, tsk.pi_lock), \ | ||
INIT_RT_MUTEX_DEBUG(tsk) | ||
#else | ||
# define INIT_RT_MUTEXES(tsk) | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.