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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * linux/lib/brlock.c
  4.  *
  5.  * 'Big Reader' read-write spinlocks.  See linux/brlock.h for details.
  6.  *
  7.  * Copyright 2000, Ingo Molnar <mingo@redhat.com>
  8.  * Copyright 2000, David S. Miller <davem@redhat.com>
  9.  */
  10. #include <linux/config.h>
  11. #ifdef CONFIG_SMP
  12. #include <linux/sched.h>
  13. #include <linux/brlock.h>
  14. #ifdef __BRLOCK_USE_ATOMICS
  15. brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
  16.    { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = RW_LOCK_UNLOCKED } };
  17. void __br_write_lock (enum brlock_indices idx)
  18. {
  19. int i;
  20. for (i = 0; i < smp_num_cpus; i++)
  21. write_lock(&__brlock_array[cpu_logical_map(i)][idx]);
  22. }
  23. void __br_write_unlock (enum brlock_indices idx)
  24. {
  25. int i;
  26. for (i = 0; i < smp_num_cpus; i++)
  27. write_unlock(&__brlock_array[cpu_logical_map(i)][idx]);
  28. }
  29. #else /* ! __BRLOCK_USE_ATOMICS */
  30. brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
  31.    { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = 0 } };
  32. struct br_wrlock __br_write_locks[__BR_IDX_MAX] =
  33.    { [0 ... __BR_IDX_MAX-1] = { SPIN_LOCK_UNLOCKED } };
  34. void __br_write_lock (enum brlock_indices idx)
  35. {
  36. int i;
  37. again:
  38. spin_lock(&__br_write_locks[idx].lock);
  39. for (i = 0; i < smp_num_cpus; i++)
  40. if (__brlock_array[cpu_logical_map(i)][idx] != 0) {
  41. spin_unlock(&__br_write_locks[idx].lock);
  42. barrier();
  43. cpu_relax();
  44. goto again;
  45. }
  46. }
  47. void __br_write_unlock (enum brlock_indices idx)
  48. {
  49. spin_unlock(&__br_write_locks[idx].lock);
  50. }
  51. #endif /* __BRLOCK_USE_ATOMICS */
  52. #endif /* CONFIG_SMP */