~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/lib/brlock.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 11 #include <linux/config.h>
 12 
 13 #ifdef CONFIG_SMP
 14 
 15 #include <linux/sched.h>
 16 #include <linux/brlock.h>
 17 
 18 #ifdef __BRLOCK_USE_ATOMICS
 19 
 20 brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
 21    { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = RW_LOCK_UNLOCKED } };
 22 
 23 void __br_write_lock (enum brlock_indices idx)
 24 {
 25         int i;
 26 
 27         for (i = 0; i < smp_num_cpus; i++)
 28                 write_lock(__brlock_array[idx] + cpu_logical_map(i));
 29 }
 30 
 31 void __br_write_unlock (enum brlock_indices idx)
 32 {
 33         int i;
 34 
 35         for (i = 0; i < smp_num_cpus; i++)
 36                 write_unlock(__brlock_array[idx] + cpu_logical_map(i));
 37 }
 38 
 39 #else /* ! __BRLOCK_USE_ATOMICS */
 40 
 41 brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
 42    { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = 0 } };
 43 
 44 struct br_wrlock __br_write_locks[__BR_IDX_MAX] =
 45    { [0 ... __BR_IDX_MAX-1] = { SPIN_LOCK_UNLOCKED } };
 46 
 47 void __br_write_lock (enum brlock_indices idx)
 48 {
 49         int i;
 50 
 51         spin_lock(&__br_write_locks[idx].lock);
 52 again:
 53         for (i = 0; i < smp_num_cpus; i++)
 54                 if (__brlock_array[cpu_logical_map(i)][idx] != 0)
 55                         goto again;
 56 }
 57 
 58 void __br_write_unlock (enum brlock_indices idx)
 59 {
 60         spin_unlock(&__br_write_locks[idx].lock);
 61 }
 62 
 63 #endif /* __BRLOCK_USE_ATOMICS */
 64 
 65 #endif /* CONFIG_SMP */
 66 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.