~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/include/asm-arm/semaphore-helper.h

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef ASMARM_SEMAPHORE_HELPER_H
  2 #define ASMARM_SEMAPHORE_HELPER_H
  3 
  4 /*
  5  * These two _must_ execute atomically wrt each other.
  6  */
  7 static inline void wake_one_more(struct semaphore * sem)
  8 {
  9         unsigned long flags;
 10 
 11         spin_lock_irqsave(&semaphore_wake_lock, flags);
 12         if (atomic_read(&sem->count) <= 0)
 13                 sem->waking++;
 14         spin_unlock_irqrestore(&semaphore_wake_lock, flags);
 15 }
 16 
 17 static inline int waking_non_zero(struct semaphore *sem)
 18 {
 19         unsigned long flags;
 20         int ret = 0;
 21 
 22         spin_lock_irqsave(&semaphore_wake_lock, flags);
 23         if (sem->waking > 0) {
 24                 sem->waking--;
 25                 ret = 1;
 26         }
 27         spin_unlock_irqrestore(&semaphore_wake_lock, flags);
 28         return ret;
 29 }
 30 
 31 /*
 32  * waking non zero interruptible
 33  *      1       got the lock
 34  *      0       go to sleep
 35  *      -EINTR  interrupted
 36  *
 37  * We must undo the sem->count down_interruptible() increment while we are
 38  * protected by the spinlock in order to make this atomic_inc() with the
 39  * atomic_read() in wake_one_more(), otherwise we can race. -arca
 40  */
 41 static inline int waking_non_zero_interruptible(struct semaphore *sem,
 42                                                 struct task_struct *tsk)
 43 {
 44         unsigned long flags;
 45         int ret = 0;
 46 
 47         spin_lock_irqsave(&semaphore_wake_lock, flags);
 48         if (sem->waking > 0) {
 49                 sem->waking--;
 50                 ret = 1;
 51         } else if (signal_pending(tsk)) {
 52                 atomic_inc(&sem->count);
 53                 ret = -EINTR;
 54         }
 55         spin_unlock_irqrestore(&semaphore_wake_lock, flags);
 56         return ret;     
 57 }
 58 
 59 /*
 60  * waking_non_zero_try_lock:
 61  *      1       failed to lock
 62  *      0       got the lock
 63  *
 64  * We must undo the sem->count down_interruptible() increment while we are
 65  * protected by the spinlock in order to make this atomic_inc() with the
 66  * atomic_read() in wake_one_more(), otherwise we can race. -arca
 67  */
 68 static inline int waking_non_zero_trylock(struct semaphore *sem)
 69 {
 70         unsigned long flags;
 71         int ret = 1;
 72 
 73         spin_lock_irqsave(&semaphore_wake_lock, flags);
 74         if (sem->waking <= 0)
 75                 atomic_inc(&sem->count);
 76         else {
 77                 sem->waking--;
 78                 ret = 0;
 79         }
 80         spin_unlock_irqrestore(&semaphore_wake_lock, flags);
 81         return ret;
 82 }
 83 
 84 #endif
 85 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.