semaphore-helper.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. /*
  11. * These two _must_ execute atomically wrt each other.
  12. */
  13. static inline void wake_one_more(struct semaphore * sem)
  14. {
  15. atomic_inc(&sem->waking);
  16. }
  17. static inline int waking_non_zero(struct semaphore *sem)
  18. {
  19. int ret;
  20. unsigned long flags;
  21. spin_lock_irqsave(&semaphore_wake_lock, flags);
  22. ret = 0;
  23. if (atomic_read(&sem->waking) > 0) {
  24. atomic_dec(&sem->waking);
  25. ret = 1;
  26. }
  27. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  28. return ret;
  29. }
  30. /*
  31. * waking_non_zero_interruptible:
  32. * 1 got the lock
  33. * 0 go to sleep
  34. * -EINTR interrupted
  35. */
  36. static inline int waking_non_zero_interruptible(struct semaphore *sem,
  37. struct task_struct *tsk)
  38. {
  39. int ret;
  40. unsigned long flags;
  41. spin_lock_irqsave(&semaphore_wake_lock, flags);
  42. ret = 0;
  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;
  61. unsigned long flags;
  62. spin_lock_irqsave(&semaphore_wake_lock, flags);
  63. ret = 1;
  64. if (atomic_read(&sem->waking) > 0) {
  65. atomic_dec(&sem->waking);
  66. ret = 0;
  67. } else
  68. atomic_inc(&sem->count);
  69. spin_unlock_irqrestore(&semaphore_wake_lock, flags);
  70. return ret;
  71. }
  72. #endif