smplock.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * <asm/smplock.h>
  3.  */
  4. #include <linux/interrupt.h>
  5. #include <linux/spinlock.h>
  6. #include <linux/sched.h>
  7. #include <asm/current.h>
  8. extern spinlock_cacheline_t kernel_flag_cacheline;  
  9. #define kernel_flag kernel_flag_cacheline.lock      
  10. #define kernel_locked() spin_is_locked(&kernel_flag)
  11. /*
  12.  * Release global kernel lock and global interrupt lock
  13.  */
  14. #define release_kernel_lock(task, cpu) 
  15. do { 
  16. if (task->lock_depth >= 0) 
  17. spin_unlock(&kernel_flag); 
  18. release_irqlock(cpu); 
  19. __sti(); 
  20. } while (0)
  21. /*
  22.  * Re-acquire the kernel lock
  23.  */
  24. #define reacquire_kernel_lock(task) 
  25. do { 
  26. if (task->lock_depth >= 0) 
  27. spin_lock(&kernel_flag); 
  28. } while (0)
  29. /*
  30.  * Getting the big kernel lock.
  31.  *
  32.  * This cannot happen asynchronously,
  33.  * so we only need to worry about other
  34.  * CPU's.
  35.  */
  36. extern __inline__ void lock_kernel(void)
  37. {
  38. #if 1
  39. if (!++current->lock_depth)
  40. spin_lock(&kernel_flag);
  41. #else
  42. __asm__ __volatile__(
  43. "incl %1nt"
  44. "jne 9f"
  45. spin_lock_string
  46. "n9:"
  47. :"=m" (__dummy_lock(&kernel_flag)),
  48.  "=m" (current->lock_depth));
  49. #endif
  50. }
  51. extern __inline__ void unlock_kernel(void)
  52. {
  53. if (current->lock_depth < 0)
  54. out_of_line_bug();
  55. #if 1
  56. if (--current->lock_depth < 0)
  57. spin_unlock(&kernel_flag);
  58. #else
  59. __asm__ __volatile__(
  60. "decl %1nt"
  61. "jns 9fnt"
  62. spin_unlock_string
  63. "n9:"
  64. :"=m" (__dummy_lock(&kernel_flag)),
  65.  "=m" (current->lock_depth));
  66. #endif
  67. }