home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Headers / mach / i386 / simple_lock.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-27  |  1.1 KB  |  80 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. #define _MACHINE_SIMPLE_LOCK_DATA_
  18.  
  19. struct slock {
  20.     boolean_t        locked;
  21. };
  22.  
  23. typedef struct slock        simple_lock_data_t;
  24. typedef simple_lock_data_t    *simple_lock_t;
  25.  
  26. static __inline__
  27. void
  28. simple_lock_init(
  29.     simple_lock_t    slock
  30. )
  31. {
  32.     slock->locked = FALSE;
  33. }
  34.  
  35. static __inline__
  36. boolean_t
  37. simple_lock_try(
  38.     simple_lock_t    slock
  39. )
  40. {
  41.     boolean_t        result;
  42.     
  43.     asm volatile(
  44.         "xchgl %1,%0; xorl %3,%0"
  45.         : "=r" (result), "=m" (slock->locked)
  46.         : "0" (TRUE), "i" (TRUE));
  47.         
  48.     return (result);
  49. }
  50.  
  51. static __inline__
  52. void
  53. simple_lock(
  54.     simple_lock_t    slock
  55. )
  56. {    
  57.     do
  58.         {
  59.         while (slock->locked)
  60.         continue;
  61.     }
  62.     while (!simple_lock_try(slock));
  63. }
  64.  
  65. static __inline__
  66. void
  67. simple_unlock(
  68.     simple_lock_t    slock
  69. )
  70. {
  71.     boolean_t        result;
  72.     
  73.     asm volatile(
  74.     "xchgl %1,%0"
  75.         : "=r" (result), "=m" (slock->locked)
  76.         : "0" (FALSE));
  77. }
  78.  
  79. #endif    _MACH_I386_SIMPLE_LOCK_H_
  80.