semaphore-helper.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: semaphore-helper.h,v 1.3 2001/03/26 15:00:33 orjanf Exp $
  2.  *
  3.  * SMP- and interrupt-safe semaphores helper functions. Generic versions, no
  4.  * optimizations whatsoever... 
  5.  *
  6.  */
  7. #ifndef _ASM_SEMAPHORE_HELPER_H
  8. #define _ASM_SEMAPHORE_HELPER_H
  9. #include <asm/atomic.h>
  10. #define read(a) ((a)->counter)
  11. #define inc(a) (((a)->counter)++)
  12. #define dec(a) (((a)->counter)--)
  13. #define count_inc(a) ((*(a))++)
  14. /*
  15.  * These two _must_ execute atomically wrt each other.
  16.  */
  17. static inline void wake_one_more(struct semaphore * sem)
  18. {
  19. atomic_inc(&sem->waking);
  20. }
  21. static inline int waking_non_zero(struct semaphore *sem)
  22. {
  23. unsigned long flags;
  24. int ret = 0;
  25. save_and_cli(flags);
  26. if (read(&sem->waking) > 0) {
  27. dec(&sem->waking);
  28. ret = 1;
  29. }
  30. restore_flags(flags);
  31. return ret;
  32. }
  33. static inline int waking_non_zero_interruptible(struct semaphore *sem,
  34. struct task_struct *tsk)
  35. {
  36. int ret = 0;
  37. unsigned long flags;
  38. save_and_cli(flags);
  39. if (read(&sem->waking) > 0) {
  40. dec(&sem->waking);
  41. ret = 1;
  42. } else if (signal_pending(tsk)) {
  43. count_inc(&sem->count);
  44. ret = -EINTR;
  45. }
  46. restore_flags(flags);
  47. return ret;
  48. }
  49. static inline int waking_non_zero_trylock(struct semaphore *sem)
  50. {
  51.         int ret = 1;
  52. unsigned long flags;
  53. save_and_cli(flags);
  54. if (read(&sem->waking) <= 0)
  55. count_inc(&sem->count);
  56. else {
  57. dec(&sem->waking);
  58. ret = 0;
  59. }
  60. restore_flags(flags);
  61. return ret;
  62. }
  63. #endif /* _ASM_SEMAPHORE_HELPER_H */