File: /Users/paulross/dev/linux/linux-3.13/include/linux/rtmutex.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: /*
       2:  * RT Mutexes: blocking mutual exclusion locks with PI support
       3:  *
       4:  * started by Ingo Molnar and Thomas Gleixner:
       5:  *
       6:  *  Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
       7:  *  Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>
       8:  *
       9:  * This file contains the public data structure and API definitions.
      10:  */
      11: 
      12: #ifndef __LINUX_RT_MUTEX_H
      13: #define __LINUX_RT_MUTEX_H
      14: 
      15: #include <linux/linkage.h>
      16: #include <linux/plist.h>
      17: #include <linux/spinlock_types.h>
      18: 
      19: extern int max_lock_depth; /* for sysctl */
      20: 
      21: /**
      22:  * The rt_mutex structure
      23:  *
      24:  * @wait_lock:    spinlock to protect the structure
      25:  * @wait_list:    pilist head to enqueue waiters in priority order
      26:  * @owner:    the mutex owner
      27:  */
      28: struct rt_mutex {
      29:     raw_spinlock_t        wait_lock;
      30:     struct plist_head    wait_list;
      31:     struct task_struct    *owner;
      32: #ifdef CONFIG_DEBUG_RT_MUTEXES
      33:     int            save_state;
      34:     const char         *name, *file;
      35:     int            line;
      36:     void            *magic;
      37: #endif
      38: };
      39: 
      40: struct rt_mutex_waiter;
      41: struct hrtimer_sleeper;
      42: 
      43: #ifdef CONFIG_DEBUG_RT_MUTEXES
      44:  extern int rt_mutex_debug_check_no_locks_freed(const void *from,
      45:                         unsigned long len);
      46:  extern void rt_mutex_debug_check_no_locks_held(struct task_struct *task);
      47: #else
      48:  static inline int rt_mutex_debug_check_no_locks_freed(const void *from,
      49:                                unsigned long len)
      50:  {
      51:     return 0;
      52:  }
      53: # define rt_mutex_debug_check_no_locks_held(task)    do { } while (0)
      54: #endif
      55: 
      56: #ifdef CONFIG_DEBUG_RT_MUTEXES
      57: # define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \
      58:     , .name = #mutexname, .file = __FILE__, .line = __LINE__
      59: # define rt_mutex_init(mutex)            __rt_mutex_init(mutex, __func__)
      60:  extern void rt_mutex_debug_task_free(struct task_struct *tsk);
      61: #else
      62: # define __DEBUG_RT_MUTEX_INITIALIZER(mutexname)
      63: # define rt_mutex_init(mutex)            __rt_mutex_init(mutex, NULL)
      64: # define rt_mutex_debug_task_free(t)            do { } while (0)
      65: #endif
      66: 
      67: #define __RT_MUTEX_INITIALIZER(mutexname) \
      68:     { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \
      69:     , .wait_list = PLIST_HEAD_INIT(mutexname.wait_list) \
      70:     , .owner = NULL \
      71:     __DEBUG_RT_MUTEX_INITIALIZER(mutexname)}
      72: 
      73: #define DEFINE_RT_MUTEX(mutexname) \
      74:     struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname)
      75: 
      76: /**
      77:  * rt_mutex_is_locked - is the mutex locked
      78:  * @lock: the mutex to be queried
      79:  *
      80:  * Returns 1 if the mutex is locked, 0 if unlocked.
      81:  */
      82: static inline int rt_mutex_is_locked(struct rt_mutex *lock)
      83: {
      84:     return lock->owner != NULL;
      85: }
      86: 
      87: extern void __rt_mutex_init(struct rt_mutex *lock, const char *name);
      88: extern void rt_mutex_destroy(struct rt_mutex *lock);
      89: 
      90: extern void rt_mutex_lock(struct rt_mutex *lock);
      91: extern int rt_mutex_lock_interruptible(struct rt_mutex *lock,
      92:                         int detect_deadlock);
      93: extern int rt_mutex_timed_lock(struct rt_mutex *lock,
      94:                     struct hrtimer_sleeper *timeout,
      95:                     int detect_deadlock);
      96: 
      97: extern int rt_mutex_trylock(struct rt_mutex *lock);
      98: 
      99: extern void rt_mutex_unlock(struct rt_mutex *lock);
     100: 
     101: #ifdef CONFIG_RT_MUTEXES
     102: # define INIT_RT_MUTEXES(tsk)                        \
     103:     .pi_waiters    = PLIST_HEAD_INIT(tsk.pi_waiters),    \
     104:     INIT_RT_MUTEX_DEBUG(tsk)
     105: #else
     106: # define INIT_RT_MUTEXES(tsk)
     107: #endif
     108: 
     109: #endif
     110: