АРХИВ ПО ТЭГУ "CAS LOCK"
ДЕКАБРЬ 16, 2012

Hi,

Бытсро, проверили, где баги и как лучше сделать (особенно волнует метод value:, нужно ли там темп вар)? Есть ли в кокоа уже имплементация КАС лока? Пасибо/

interface

 

#import <Foundation/Foundation.h>
  1.  
  2. @interface CASLock : NSObject
  3. {
  4. @private
  5.     NSLock * lock;
  6.     BOOL val;
  7. }
  8.  
  9. + (CASLock *)lockWithValue:(BOOL)bval;
  10. - (id)initWithValue:(BOOL)bval;
  11.  
  12. /// Check (and set) lock value to AA:
  13. /// — if lock value is AA:      return YES and do update lock value.
  14. /// — if lock value is not AA:  return NO and do not update lock value.
  15. ///
  16. /// Example usage:
  17. /// <code>
  18. /// if (![checkAndSetLock:NO]) {
  19. /// return; // lock value is already YES
  20. /// }
  21. /// // do stuff, lock value changed to YES
  22. /// </code>
  23. - (BOOL)checkAndSetLock:(BOOL)expected;
  24. - (void)setLock:(BOOL)newval;
  25. - (BOOL)value;
  26.  
  27. @end

implementation

 

#import «CASLock.h»
  1.  
  2. @implementation CASLock
  3.  
  4. + (CASLock *)lockWithValue:(BOOL)bval
  5. {
  6.     return [[CASLock alloc] initWithValue:bval];
  7. }
  8.  
  9. - (id)initWithValue:(BOOL)bval
  10. {
  11.     self = [super init];
  12.     if (self) {
  13.         lock = [[NSLock alloc] init];
  14.         val = bval;
  15.     }
  16.     return self;
  17. }
  18.  
  19. - (void)dealloc
  20. {
  21.     [lock release];
  22.     [super dealloc];
  23. }
  24.  
  25. - (BOOL)checkAndSetLock:(BOOL)expected
  26. {
  27.     @try {
  28.         [lock lock];
  29.         if (val == expected) {
  30.             val = !expected;
  31.             return YES;
  32.         }
  33.         else {
  34.             return NO;
  35.         }
  36.     }
  37.     @finally {
  38.         [lock unlock];
  39.     }
  40. }
  41.  
  42. - (void)setLock:(BOOL)newval
  43. {
  44.     @try {
  45.         [lock lock];
  46.         val = newval;
  47.     }
  48.     @finally {
  49.         [lock unlock];
  50.     }
  51. }
  52.  
  53. - (BOOL)value
  54. {
  55.     @try {
  56.         [lock lock];
  57.         BOOL tmp = val;
  58.         return tmp;
  59.     }
  60.     @finally {
  61.         [lock unlock];
  62.     }
  63. }