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

嵌入式Linux

开发平台:

Unix_Linux

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