PINRemoteLock.m 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //
  2. // PINRemoteLock.m
  3. // Pods
  4. //
  5. // Created by Garrett Moon on 3/17/16.
  6. //
  7. //
  8. #import "PINRemoteLock.h"
  9. #import <pthread.h>
  10. #if !defined(PINREMOTELOCK_DEBUG) && defined(DEBUG)
  11. #define PINREMOTELOCK_DEBUG DEBUG
  12. #endif
  13. @interface PINRemoteLock ()
  14. {
  15. #if PINREMOTELOCK_DEBUG
  16. NSLock *_lock;
  17. NSRecursiveLock *_recursiveLock;
  18. #else
  19. pthread_mutex_t _lock;
  20. #endif
  21. }
  22. @end
  23. @implementation PINRemoteLock
  24. - (instancetype)init
  25. {
  26. return [self initWithName:nil];
  27. }
  28. - (instancetype)initWithName:(NSString *)lockName lockType:(PINRemoteLockType)lockType
  29. {
  30. if (self = [super init]) {
  31. #if PINREMOTELOCK_DEBUG
  32. if (lockType == PINRemoteLockTypeNonRecursive) {
  33. _lock = [[NSLock alloc] init];
  34. } else {
  35. _recursiveLock = [[NSRecursiveLock alloc] init];
  36. }
  37. if (lockName) {
  38. [_lock setName:lockName];
  39. [_recursiveLock setName:lockName];
  40. }
  41. #else
  42. pthread_mutexattr_t attr;
  43. pthread_mutexattr_init(&attr);
  44. if (lockType == PINRemoteLockTypeRecursive) {
  45. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
  46. }
  47. pthread_mutex_init(&_lock, &attr);
  48. #endif
  49. }
  50. return self;
  51. }
  52. - (instancetype)initWithName:(NSString *)lockName
  53. {
  54. return [self initWithName:lockName lockType:PINRemoteLockTypeNonRecursive];
  55. }
  56. #if ! PINREMOTELOCK_DEBUG
  57. - (void)dealloc
  58. {
  59. pthread_mutex_destroy(&_lock);
  60. }
  61. #endif
  62. - (void)lockWithBlock:(dispatch_block_t)block
  63. {
  64. #if PINREMOTELOCK_DEBUG
  65. [_lock lock];
  66. [_recursiveLock lock];
  67. #else
  68. pthread_mutex_lock(&_lock);
  69. #endif
  70. block();
  71. #if PINREMOTELOCK_DEBUG
  72. [_lock unlock];
  73. [_recursiveLock unlock];
  74. #else
  75. pthread_mutex_unlock(&_lock);
  76. #endif
  77. }
  78. - (void)lock
  79. {
  80. #if PINREMOTELOCK_DEBUG
  81. [_lock lock];
  82. [_recursiveLock lock];
  83. #else
  84. pthread_mutex_lock(&_lock);
  85. #endif
  86. }
  87. - (void)unlock
  88. {
  89. #if PINREMOTELOCK_DEBUG
  90. [_lock unlock];
  91. [_recursiveLock unlock];
  92. #else
  93. pthread_mutex_unlock(&_lock);
  94. #endif
  95. }
  96. @end