From 86da2ea1df4effe81083027bec89156c74e8d8bf Mon Sep 17 00:00:00 2001 From: Adlai Holler Date: Sun, 25 Mar 2018 11:13:46 -0700 Subject: [PATCH] Make ASBatchContext lock-free --- AsyncDisplayKit.xcodeproj/project.pbxproj | 8 ++--- .../{ASBatchContext.mm => ASBatchContext.m} | 30 +++++++------------ 2 files changed, 14 insertions(+), 24 deletions(-) rename Source/Details/{ASBatchContext.mm => ASBatchContext.m} (65%) diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index be2a0441f..829b21474 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -264,7 +264,7 @@ B35062131B010EFD0018CF92 /* ASBasicImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 054963471A1EA066000F8E56 /* ASBasicImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; B35062141B010EFD0018CF92 /* ASBasicImageDownloader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 054963481A1EA066000F8E56 /* ASBasicImageDownloader.mm */; }; B35062151B010EFD0018CF92 /* ASBatchContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 299DA1A71A828D2900162D41 /* ASBatchContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B35062161B010EFD0018CF92 /* ASBatchContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = 299DA1A81A828D2900162D41 /* ASBatchContext.mm */; }; + B35062161B010EFD0018CF92 /* ASBatchContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 299DA1A81A828D2900162D41 /* ASBatchContext.m */; }; B35062171B010EFD0018CF92 /* ASDataController.h in Headers */ = {isa = PBXBuildFile; fileRef = 464052191A3F83C40061C0BA /* ASDataController.h */; settings = {ATTRIBUTES = (Public, ); }; }; B35062181B010EFD0018CF92 /* ASDataController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4640521A1A3F83C40061C0BA /* ASDataController.mm */; }; B350621B1B010EFD0018CF92 /* ASTableLayoutController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4640521B1A3F83C40061C0BA /* ASTableLayoutController.h */; settings = {ATTRIBUTES = (Private, ); }; }; @@ -633,7 +633,7 @@ 296A0A311A951715005ACEAA /* ASScrollDirection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASScrollDirection.h; path = Source/Details/ASScrollDirection.h; sourceTree = SOURCE_ROOT; }; 296A0A341A951ABF005ACEAA /* ASBatchFetchingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ASBatchFetchingTests.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 299DA1A71A828D2900162D41 /* ASBatchContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASBatchContext.h; sourceTree = ""; }; - 299DA1A81A828D2900162D41 /* ASBatchContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASBatchContext.mm; sourceTree = ""; }; + 299DA1A81A828D2900162D41 /* ASBatchContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASBatchContext.m; sourceTree = ""; }; 29CDC2E11AAE70D000833CA4 /* ASBasicImageDownloaderContextTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ASBasicImageDownloaderContextTests.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 3917EBD21E9C2FC400D04A01 /* _ASCollectionReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _ASCollectionReusableView.h; sourceTree = ""; }; 3917EBD31E9C2FC400D04A01 /* _ASCollectionReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _ASCollectionReusableView.m; sourceTree = ""; }; @@ -1305,7 +1305,7 @@ 054963471A1EA066000F8E56 /* ASBasicImageDownloader.h */, 054963481A1EA066000F8E56 /* ASBasicImageDownloader.mm */, 299DA1A71A828D2900162D41 /* ASBatchContext.h */, - 299DA1A81A828D2900162D41 /* ASBatchContext.mm */, + 299DA1A81A828D2900162D41 /* ASBatchContext.m */, E5C347B01ECB3D9200EC4BE4 /* ASBatchFetchingDelegate.h */, 205F0E1B1B373A2C007741D0 /* ASCollectionViewLayoutController.h */, 205F0E1C1B373A2C007741D0 /* ASCollectionViewLayoutController.m */, @@ -2294,7 +2294,7 @@ 34EFC7621B701CA400AD841F /* ASBackgroundLayoutSpec.mm in Sources */, DE8BEAC41C2DF3FC00D57C12 /* ASDelegateProxy.m in Sources */, B35062141B010EFD0018CF92 /* ASBasicImageDownloader.mm in Sources */, - B35062161B010EFD0018CF92 /* ASBatchContext.mm in Sources */, + B35062161B010EFD0018CF92 /* ASBatchContext.m in Sources */, AC47D9421B3B891B00AAEE9D /* ASCellNode.mm in Sources */, E58E9E451E941D74004CFC59 /* ASCollectionLayoutContext.m in Sources */, 34EFC7641B701CC600AD841F /* ASCenterLayoutSpec.mm in Sources */, diff --git a/Source/Details/ASBatchContext.mm b/Source/Details/ASBatchContext.m similarity index 65% rename from Source/Details/ASBatchContext.mm rename to Source/Details/ASBatchContext.m index 8598126d2..5ac780ddc 100644 --- a/Source/Details/ASBatchContext.mm +++ b/Source/Details/ASBatchContext.m @@ -1,5 +1,5 @@ // -// ASBatchContext.mm +// ASBatchContext.m // Texture // // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. @@ -18,7 +18,7 @@ #import #import -#import +#import typedef NS_ENUM(NSInteger, ASBatchContextState) { ASBatchContextStateFetching, @@ -26,54 +26,44 @@ typedef NS_ENUM(NSInteger, ASBatchContextState) { ASBatchContextStateCompleted }; -@interface ASBatchContext () -{ - ASBatchContextState _state; - ASDN::RecursiveMutex __instanceLock__; +@implementation ASBatchContext { + atomic_int _state; } -@end - -@implementation ASBatchContext - (instancetype)init { if (self = [super init]) { - _state = ASBatchContextStateCompleted; + _state = ATOMIC_VAR_INIT(ASBatchContextStateCompleted); } return self; } - (BOOL)isFetching { - ASDN::MutexLocker l(__instanceLock__); - return _state == ASBatchContextStateFetching; + return atomic_load(&_state) == ASBatchContextStateFetching; } - (BOOL)batchFetchingWasCancelled { - ASDN::MutexLocker l(__instanceLock__); - return _state == ASBatchContextStateCancelled; + return atomic_load(&_state) == ASBatchContextStateCancelled; } - (void)beginBatchFetching { - ASDN::MutexLocker l(__instanceLock__); - _state = ASBatchContextStateFetching; + atomic_store(&_state, ASBatchContextStateFetching); } - (void)completeBatchFetching:(BOOL)didComplete { if (didComplete) { as_log_debug(ASCollectionLog(), "Completed batch fetch with context %@", self); - ASDN::MutexLocker l(__instanceLock__); - _state = ASBatchContextStateCompleted; + atomic_store(&_state, ASBatchContextStateCompleted); } } - (void)cancelBatchFetching { - ASDN::MutexLocker l(__instanceLock__); - _state = ASBatchContextStateCancelled; + atomic_store(&_state, ASBatchContextStateCancelled); } @end