home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / Include / Linux / spinlock.h < prev    next >
C/C++ Source or Header  |  2002-04-26  |  3KB  |  90 lines

  1. /* $Id: spinlock.h,v 1.2 2002/04/26 23:09:15 smilcke Exp $ */
  2.  
  3. #ifndef __LINUX_SPINLOCK_H
  4. #define __LINUX_SPINLOCK_H
  5.  
  6. #ifdef __SMP__
  7. #include <asm/spinlock.h>
  8.  
  9. #else /* !SMP */
  10.  
  11. #define DEBUG_SPINLOCKS    0    /* 0 == no debugging, 1 == maintain lock state, 2 == full debug */
  12.  
  13. /*
  14.  * Your basic spinlocks, allowing only a single CPU anywhere
  15.  *
  16.  * Gcc-2.7.x has a nasty bug with empty initializers.
  17.  */
  18. typedef unsigned long spinlock_t;
  19.  
  20. #define SPIN_LOCK_UNLOCKED  0
  21.  
  22. #if (defined(TARGET_OS2) && !defined(NOOS2LXAPI))
  23. extern void (*spin_lock_init)(spinlock_t *lock);
  24. extern void (*spin_lock)(spinlock_t *lock);
  25. extern void (*spin_lock_flag)(spinlock_t *lock,unsigned long *flag);
  26. extern int (*spin_trylock)(spinlock_t *lock);
  27. extern void (*spin_unlock_wait)(spinlock_t *lock);
  28. extern void (*spin_unlock)(spinlock_t *lock);
  29. #else
  30. void spin_lock_init(spinlock_t *lock);
  31. void spin_lock(spinlock_t *lock);
  32. void spin_lock_flag(spinlock_t *lock, unsigned long *flag);
  33. int  spin_trylock(spinlock_t *lock);
  34. void spin_unlock_wait(spinlock_t *lock);
  35. void spin_unlock(spinlock_t *lock);
  36. #endif
  37.  
  38. /*
  39.  * Read-write spinlocks, allowing multiple readers
  40.  * but only one writer.
  41.  *
  42.  * NOTE! it is quite common to have readers in interrupts
  43.  * but no interrupt writers. For those circumstances we
  44.  * can "mix" irq-safe locks - any writer needs to get a
  45.  * irq-safe write-lock, but readers can get non-irqsafe
  46.  * read-locks.
  47.  *
  48.  * Gcc-2.7.x has a nasty bug with empty initializers.
  49.  */
  50.   typedef struct { int gcc_is_buggy; } rwlock_t;
  51.   #define RW_LOCK_UNLOCKED { 0 }
  52.  
  53.  
  54. /*
  55.  * These are the generic versions of the spinlocks and read-write
  56.  * locks..
  57.  */
  58.  
  59. #define spin_lock_irqsave(lock, flags)     spin_lock_flag(lock, (unsigned long *)&flags)
  60. #define spin_lock_irq(lock)        spin_lock(lock)
  61. #define spin_lock_bh(lock)        spin_lock(lock)
  62.  
  63. #define read_lock_irqsave(lock, flags)     spin_lock_flag(lock, (unsigned long *)&flags)
  64. #define read_lock_irq(lock)        spin_lock(lock)
  65. #define read_lock_bh(lock)        spin_lock(lock)
  66.  
  67. #define write_lock_irqsave(lock, flags)    spin_lock_flag(lock, (unsigned long *)&flags)
  68. #define write_lock_irq(lock)        spin_lock(lock)
  69. #define write_lock_bh(lock)        spin_lock(lock)
  70.  
  71. #define spin_unlock_irqrestore(lock, flags) spin_unlock(lock)
  72. #define spin_unlock_irq(lock)        spin_unlock(lock)
  73. #define spin_unlock_bh(lock)        spin_unlock(lock)
  74.  
  75. #define read_unlock_irqrestore(lock, flags) spin_unlock(lock)
  76. #define read_unlock_irq(lock)        spin_unlock(lock)
  77. #define read_unlock_bh(lock)        spin_unlock(lock)
  78.  
  79. #define write_unlock_irqrestore(lock, flags) spin_unlock(lock)
  80. #define write_unlock_irq(lock)        spin_unlock(lock)
  81. #define write_unlock_bh(lock)        spin_unlock(lock)
  82.  
  83. #define read_lock(lock)            spin_lock(lock)
  84. #define read_unlock(lock)        spin_unlock(lock)
  85. #define write_lock(lock)        spin_lock(lock)
  86. #define write_unlock(lock)        spin_unlock(lock)
  87.  
  88. #endif /* !SMP */
  89. #endif /* __LINUX_SPINLOCK_H */
  90.