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

嵌入式Linux

开发平台:

Unix_Linux

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