semaphore-helper.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #ifndef _M68K_SEMAPHORE_HELPER_H
  2. #define _M68K_SEMAPHORE_HELPER_H
  3. /*
  4. * SMP- and interrupt-safe semaphores helper functions.
  5. *
  6. * (C) Copyright 1996 Linus Torvalds
  7. *
  8. * m68k version by Andreas Schwab
  9. */
  10. #include <linux/config.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;
  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;
  41. unsigned long flags;
  42. spin_lock_irqsave(&semaphore_wake_lock, flags);
  43. ret = 0;
  44. if (atomic_read(&sem->waking) > 0) {
  45. atomic_dec(&sem->waking);
  46. ret = 1;
  47. } else if (signal_pending(tsk)) {
  48. atomic_inc(&sem->count);
  49. ret = -EINTR;
  50. }
  51. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  52. return ret;
  53. }
  54. /*
  55. * waking_non_zero_trylock:
  56. * 1 failed to lock
  57. * 0 got the lock
  58. */
  59. static inline int waking_non_zero_trylock(struct semaphore *sem)
  60. {
  61. int ret;
  62. unsigned long flags;
  63. spin_lock_irqsave(&semaphore_wake_lock, flags);
  64. ret = 1;
  65. if (atomic_read(&sem->waking) > 0) {
  66. atomic_dec(&sem->waking);
  67. ret = 0;
  68. } else
  69. atomic_inc(&sem->count);
  70. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  71. return ret;
  72. }
  73. #endif