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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * <asm/smplock.h>
  3.  *
  4.  * Default SMP lock implementation
  5.  */
  6. #include <linux/interrupt.h>
  7. #include <linux/spinlock.h>
  8. #include <linux/sched.h>
  9. #include <asm/current.h>
  10. #include <asm/hardirq.h>
  11. extern spinlock_t kernel_flag;
  12. #define kernel_locked() spin_is_locked(&kernel_flag)
  13. /*
  14.  * Release global kernel lock and global interrupt lock
  15.  */
  16. static __inline__ void
  17. release_kernel_lock(struct task_struct *task, int cpu)
  18. {
  19. if (task->lock_depth >= 0)
  20. spin_unlock(&kernel_flag);
  21. release_irqlock(cpu);
  22. __sti();
  23. }
  24. /*
  25.  * Re-acquire the kernel lock
  26.  */
  27. static __inline__ void
  28. reacquire_kernel_lock(struct task_struct *task)
  29. {
  30. if (task->lock_depth >= 0)
  31. spin_lock(&kernel_flag);
  32. }
  33. /*
  34.  * Getting the big kernel lock.
  35.  *
  36.  * This cannot happen asynchronously,
  37.  * so we only need to worry about other
  38.  * CPU's.
  39.  */
  40. static __inline__ void
  41. lock_kernel(void)
  42. {
  43. if (!++current->lock_depth)
  44. spin_lock(&kernel_flag);
  45. }
  46. static __inline__ void
  47. unlock_kernel(void)
  48. {
  49. if (--current->lock_depth < 0)
  50. spin_unlock(&kernel_flag);
  51. }