home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Headers / mach / i386 / simple_lock.h < prev    next >
Text File  |  1993-10-19  |  1KB  |  90 lines

  1. /*
  2.  * Copyright (c) 1992 NeXT Computer, Inc.
  3.  *
  4.  * Simple spin locks.
  5.  *
  6.  * HISTORY
  7.  *
  8.  * 19 November 1992 David E. Bohman at NeXT
  9.  *    Created.
  10.  */
  11.  
  12. #import <mach/boolean.h>
  13.  
  14. #ifndef    _MACH_I386_SIMPLE_LOCK_H_
  15. #define _MACH_I386_SIMPLE_LOCK_H_
  16.  
  17. struct slock {
  18.     boolean_t        locked;
  19. };
  20.  
  21. typedef struct slock    simple_lock_data_t;
  22. typedef struct slock    *simple_lock_t;
  23.  
  24. extern simple_lock_t    simple_lock_alloc(void);
  25. extern void        simple_lock_free(simple_lock_t);
  26.  
  27. #if    !defined(DEFINE_SIMPLE_LOCK_PRIMS)
  28. static __inline__
  29. #endif
  30. void
  31. simple_lock_init(
  32.     simple_lock_t    slock
  33. )
  34. {
  35.     slock->locked = FALSE;
  36. }
  37.  
  38. #if    !defined(DEFINE_SIMPLE_LOCK_PRIMS)
  39. static
  40. #endif
  41. __inline__
  42. boolean_t
  43. simple_lock_try(
  44.     simple_lock_t    slock
  45. )
  46. {
  47.     boolean_t        result;
  48.     
  49.     asm volatile(
  50.         "xchgl %1,%0; xorl %3,%0"
  51.         : "=r" (result), "=m" (slock->locked)
  52.         : "0" (TRUE), "i" (TRUE));
  53.         
  54.     return (result);
  55. }
  56.  
  57. #if    !defined(DEFINE_SIMPLE_LOCK_PRIMS)
  58. static __inline__
  59. #endif
  60. void
  61. simple_lock(
  62.     simple_lock_t    slock
  63. )
  64. {    
  65.     do
  66.         {
  67.         while (slock->locked)
  68.         continue;
  69.     }
  70.     while (!simple_lock_try(slock));
  71. }
  72.  
  73. #if    !defined(DEFINE_SIMPLE_LOCK_PRIMS)
  74. static __inline__
  75. #endif
  76. void
  77. simple_unlock(
  78.     simple_lock_t    slock
  79. )
  80. {
  81.     boolean_t        result;
  82.     
  83.     asm volatile(
  84.     "xchgl %1,%0"
  85.         : "=r" (result), "=m" (slock->locked)
  86.         : "0" (FALSE));
  87. }
  88.  
  89. #endif    _MACH_I386_SIMPLE_LOCK_H_
  90.