semaphore-helper.h 1.6 KB

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