BUADLock.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // ABULock.h
  3. // ABUAdSDK
  4. //
  5. // Created by bytedance on 2021/8/10.
  6. //
  7. #import <Foundation/Foundation.h>
  8. #import <pthread/pthread.h>
  9. #import <objc/runtime.h>
  10. //#import <pthread.h>
  11. NS_ASSUME_NONNULL_BEGIN
  12. #define LOCKNAME_C "buad_lock"
  13. #define RWLOCKNAME_C "buad_rw_lock"
  14. //#define RECURSIVELOCKNAME_C "buad_recursive_lock"
  15. #if DEBUG
  16. #define buad_C_ASSERT(condition, desc) \
  17. do { \
  18. if(!(condition)){ \
  19. printf("buad_Assert : file: %s, line: %u , desc: %s", __FILE__, __LINE__, desc);\
  20. abort();\
  21. }\
  22. } while(0)
  23. #else
  24. #define buad_C_ASSERT(condition, desc)
  25. #endif
  26. /// 锁_信号量_初始化
  27. /// @Warning 在使用buad_lock时, 请注意 [1]重入case的死锁问题; [2]当主线程参与锁时, 可能的watchdog风险
  28. static inline
  29. void buad_lock_init(id binder) {
  30. if (!binder) return;
  31. dispatch_semaphore_t lock = dispatch_semaphore_create(1);
  32. objc_setAssociatedObject(binder, LOCKNAME_C, lock, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  33. }
  34. /// 锁_信号量_加锁
  35. static inline
  36. void buad_lock(id binder) {
  37. if (!binder) return;
  38. dispatch_semaphore_t lock = objc_getAssociatedObject(binder, LOCKNAME_C);
  39. buad_C_ASSERT(lock, "buad_lock时,lock未获取,请检查是否init");
  40. if (lock) {
  41. dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
  42. }
  43. }
  44. /// 锁_信号量_解锁
  45. static inline
  46. void buad_unlock(id binder) {
  47. if (!binder) return;
  48. dispatch_semaphore_t lock = objc_getAssociatedObject(binder, LOCKNAME_C);
  49. buad_C_ASSERT(lock, "buad_unlock时,lock未获取,请检查是否init");
  50. if (lock) {
  51. dispatch_semaphore_signal(lock);
  52. }
  53. }
  54. /////锁_读写锁_初始化
  55. //static inline
  56. //void buad_rw_lock_init(id binder) {
  57. //
  58. // if (!binder) return;
  59. // dispatch_queue_t queue = dispatch_queue_create("bu.rwlock.concurrent.com", DISPATCH_QUEUE_CONCURRENT);
  60. // objc_setAssociatedObject(binder,RWLOCKNAME_C, queue, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  61. //}
  62. //
  63. /////锁_读写锁_读
  64. //static inline
  65. //id buad_read_lock(id binder, id(^block)(void)) {
  66. //
  67. // if (!binder || !block) return nil;
  68. // dispatch_queue_t queue = objc_getAssociatedObject(binder, RWLOCKNAME_C);
  69. // buad_C_ASSERT(queue, "buad_read_lock时, queue未获取,请检查是否执行buad_rw_lock_init()");
  70. // if (queue) {
  71. // __block id resultValue = nil;
  72. // dispatch_sync(queue, ^{
  73. // resultValue = block();
  74. // });
  75. // return resultValue;
  76. // }
  77. // return nil;
  78. //}
  79. //
  80. /////锁_读写锁_写
  81. //static inline
  82. //void buad_write_lock(id binder, void(^block)(void)) {
  83. //
  84. // if (!binder || !block) return ;
  85. //
  86. // dispatch_queue_t queue = objc_getAssociatedObject(binder, RWLOCKNAME_C);
  87. // buad_C_ASSERT(queue, "buad_write_lock时, queue未获取,请检查是否执行buad_rw_lock_init()");
  88. // if (queue) {
  89. // dispatch_barrier_async(queue, block);
  90. // }
  91. //}
  92. ///锁_读写锁_重入锁 有使用场景时 按需添加 pthread_mutex_t PTHREAD_MUTEX_RECURSIVE
  93. //static inline
  94. //void buad_recursive_lock(id binder)
  95. NS_ASSUME_NONNULL_END