semaphore-helper.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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/config.h>
  12. #include <linux/errno.h>
  13. /*
  14. * These two _must_ execute atomically wrt each other.
  15. */
  16. static inline void wake_one_more(struct semaphore * sem)
  17. {
  18. atomic_inc((atomic_t *)&sem->sleepers);
  19. }
  20. static inline int waking_non_zero(struct semaphore *sem)
  21. {
  22. int ret;
  23. unsigned long flags;
  24. spin_lock_irqsave(&semaphore_wake_lock, flags);
  25. ret = 0;
  26. if (sem->sleepers > 0) {
  27. sem->sleepers--;
  28. ret = 1;
  29. }
  30. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  31. return ret;
  32. }
  33. /*
  34. * waking_non_zero_interruptible:
  35. * 1 got the lock
  36. * 0 go to sleep
  37. * -EINTR interrupted
  38. */
  39. static inline int waking_non_zero_interruptible(struct semaphore *sem,
  40. struct task_struct *tsk)
  41. {
  42. int ret;
  43. unsigned long flags;
  44. spin_lock_irqsave(&semaphore_wake_lock, flags);
  45. ret = 0;
  46. if (sem->sleepers > 0) {
  47. sem->sleepers--;
  48. ret = 1;
  49. } else if (signal_pending(tsk)) {
  50. atomic_inc(&sem->count);
  51. ret = -EINTR;
  52. }
  53. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  54. return ret;
  55. }
  56. /*
  57. * waking_non_zero_trylock:
  58. * 1 failed to lock
  59. * 0 got the lock
  60. */
  61. static inline int waking_non_zero_trylock(struct semaphore *sem)
  62. {
  63. int ret;
  64. unsigned long flags;
  65. spin_lock_irqsave(&semaphore_wake_lock, flags);
  66. ret = 1;
  67. if (sem->sleepers <= 0)
  68. atomic_inc(&sem->count);
  69. else {
  70. sem->sleepers--;
  71. ret = 0;
  72. }
  73. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  74. return ret;
  75. }
  76. #endif