semaphore-helper.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* Based on M68K version, Lineo Inc. May 2001 */
  2. #ifndef _BFIN_SEMAPHORE_HELPER_H
  3. #define _BFIN_SEMAPHORE_HELPER_H
  4. /*
  5. * SMP- and interrupt-safe semaphores helper functions.
  6. *
  7. * (C) Copyright 1996 Linus Torvalds
  8. *
  9. */
  10. #include <asm/errno.h>
  11. /*
  12. * These two _must_ execute atomically wrt each other.
  13. */
  14. static inline void wake_one_more(struct semaphore *sem)
  15. {
  16. atomic_inc(&sem->waking);
  17. }
  18. static inline int waking_non_zero(struct semaphore *sem)
  19. {
  20. int ret;
  21. unsigned long flags = 0;
  22. spin_lock_irqsave(&semaphore_wake_lock, flags);
  23. ret = 0;
  24. if (atomic_read(&sem->waking) > 0) {
  25. atomic_dec(&sem->waking);
  26. ret = 1;
  27. }
  28. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  29. return ret;
  30. }
  31. /*
  32. * waking_non_zero_interruptible:
  33. * 1 got the lock
  34. * 0 go to sleep
  35. * -EINTR interrupted
  36. */
  37. static inline int waking_non_zero_interruptible(struct semaphore *sem,
  38. struct task_struct *tsk)
  39. {
  40. int ret = 0;
  41. unsigned long flags = 0;
  42. spin_lock_irqsave(&semaphore_wake_lock, flags);
  43. if (atomic_read(&sem->waking) > 0) {
  44. atomic_dec(&sem->waking);
  45. ret = 1;
  46. } else if (signal_pending(tsk)) {
  47. atomic_inc(&sem->count);
  48. ret = -EINTR;
  49. }
  50. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  51. return ret;
  52. }
  53. /*
  54. * waking_non_zero_trylock:
  55. * 1 failed to lock
  56. * 0 got the lock
  57. */
  58. static inline int waking_non_zero_trylock(struct semaphore *sem)
  59. {
  60. int ret = 1;
  61. unsigned long flags = 0;
  62. spin_lock_irqsave(&semaphore_wake_lock, flags);
  63. if (atomic_read(&sem->waking) > 0) {
  64. atomic_dec(&sem->waking);
  65. ret = 0;
  66. } else
  67. atomic_inc(&sem->count);
  68. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  69. return ret;
  70. }
  71. #endif /* _BFIN_SEMAPHORE_HELPER_H */