Skip to content

Commit

Permalink
Add multi-threading safe initialization of singleton objects. Off by …
Browse files Browse the repository at this point in the history
…default, enabled with the C Preprocessor flag DT_USE_THREAD_SAFE_INITIALIZATION.
  • Loading branch information
johnezang committed Jun 27, 2011
1 parent 41650c9 commit e5e1568
Show file tree
Hide file tree
Showing 6 changed files with 518 additions and 3 deletions.
7 changes: 7 additions & 0 deletions Classes/DTCoreTextFontCollection.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,17 @@ @implementation DTCoreTextFontCollection

+ (DTCoreTextFontCollection *)availableFontsCollection
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_availableFontsCollection = [[DTCoreTextFontCollection alloc] initWithAvailableFonts];
});
#else
if (!_availableFontsCollection)
{
_availableFontsCollection = [[DTCoreTextFontCollection alloc] initWithAvailableFonts];
}
#endif

return _availableFontsCollection;
}
Expand Down
66 changes: 63 additions & 3 deletions Classes/DTCoreTextFontDescriptor.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,47 @@
static NSCache *_fontCache = nil;
static NSMutableDictionary *_fontOverrides = nil;

#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static NSRecursiveLock *_fontOverridesLock = nil;

@implementation DTCoreTextFontDescriptor
static void dt_loadTimeInitialization(void) __attribute__ ((constructor, used));
static void dt_loadTimeInitialization(void) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Though technically not required, the run time environment at load time initialization may be less than ideal.

_fontOverridesLock = [[NSRecursiveLock alloc] init];
[_fontOverridesLock setName:@"DTCoreTextFontDescriptor fontOverrides lock"];

[pool drain]; pool = NULL;
}
#endif // DT_USE_THREAD_SAFE_INITIALIZATION


@implementation DTCoreTextFontDescriptor

+ (NSCache *)fontCache
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_fontCache = [[NSCache alloc] init];
});
#else
if (!_fontCache)
{
_fontCache = [[NSCache alloc] init];
}
#endif

return _fontCache;
}

+ (NSMutableDictionary *)fontOverrides
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
NSParameterAssert(_fontOverridesLock != nil);
[_fontOverridesLock lock];
#endif

if (!_fontOverrides)
{
_fontOverrides = [[NSMutableDictionary alloc] init];
Expand Down Expand Up @@ -56,36 +80,72 @@ + (NSMutableDictionary *)fontOverrides
}
}
}


#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
[_fontOverridesLock unlock];
#endif

return _fontOverrides;
}

+ (void)setSmallCapsFontName:(NSString *)fontName forFontFamily:(NSString *)fontFamily bold:(BOOL)bold italic:(BOOL)italic
{
NSString *key = [NSString stringWithFormat:@"%@-%d-%d-smallcaps", fontFamily, bold, italic];

#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
NSParameterAssert(_fontOverridesLock != nil);
[_fontOverridesLock lock];
#endif
[[DTCoreTextFontDescriptor fontOverrides] setObject:fontName forKey:key];
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
[_fontOverridesLock unlock];
#endif
}

+ (NSString *)smallCapsFontNameforFontFamily:(NSString *)fontFamily bold:(BOOL)bold italic:(BOOL)italic
{
NSString *key = [NSString stringWithFormat:@"%@-%d-%d-smallcaps", fontFamily, bold, italic];


#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
NSParameterAssert(_fontOverridesLock != nil);
[_fontOverridesLock lock];
NSString *returnString = [[[DTCoreTextFontDescriptor fontOverrides] objectForKey:key] retain];
[_fontOverridesLock unlock];

return [returnString autorelease];
#else
return [[DTCoreTextFontDescriptor fontOverrides] objectForKey:key];
#endif
}

+ (void)setOverrideFontName:(NSString *)fontName forFontFamily:(NSString *)fontFamily bold:(BOOL)bold italic:(BOOL)italic
{
NSString *key = [NSString stringWithFormat:@"%@-%d-%d-override", fontFamily, bold, italic];

#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
NSParameterAssert(_fontOverridesLock != nil);
[_fontOverridesLock lock];
#endif
[[DTCoreTextFontDescriptor fontOverrides] setObject:fontName forKey:key];
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
[_fontOverridesLock unlock];
#endif
}

+ (NSString *)overrideFontNameforFontFamily:(NSString *)fontFamily bold:(BOOL)bold italic:(BOOL)italic
{
NSString *key = [NSString stringWithFormat:@"%@-%d-%d-override", fontFamily, bold, italic];

#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
NSParameterAssert(_fontOverridesLock != nil);
[_fontOverridesLock lock];
NSString *returnString = [[[DTCoreTextFontDescriptor fontOverrides] objectForKey:key] retain];
[_fontOverridesLock unlock];

return [returnString autorelease];
#else
return [[DTCoreTextFontDescriptor fontOverrides] objectForKey:key];
#endif
}

+ (DTCoreTextFontDescriptor *)fontDescriptorWithFontAttributes:(NSDictionary *)attributes
Expand Down
7 changes: 7 additions & 0 deletions Classes/DTLazyImageView.m
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,17 @@ - (void)completeDownloadWithData:(NSData *)data

[self notify];

#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_imageCache = [[NSCache alloc] init];
});
#else
if (!_imageCache)
{
_imageCache = [[NSCache alloc] init];
}
#endif

if (_url)
{
Expand Down
30 changes: 30 additions & 0 deletions Classes/NSCharacterSet+HTML.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,43 +17,73 @@ @implementation NSCharacterSet (HTML)

+ (NSCharacterSet *)tagNameCharacterSet
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_tagNameCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"] retain];
});
#else
if (!_tagNameCharacterSet)
{
_tagNameCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"] retain];
}
#endif

return _tagNameCharacterSet;
}

+ (NSCharacterSet *)tagAttributeNameCharacterSet
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
});
#else
if (!_tagAttributeNameCharacterSet)
{
_tagAttributeNameCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"] retain];
}
#endif

return _tagAttributeNameCharacterSet;
}

+ (NSCharacterSet *)quoteCharacterSet
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_quoteCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"'\""] retain];
});
#else
if (!_quoteCharacterSet)
{
_quoteCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"'\""] retain];
}
#endif

return _quoteCharacterSet;
}

+ (NSCharacterSet *)nonQuotedAttributeEndCharacterSet
{
#ifdef DT_USE_THREAD_SAFE_INITIALIZATION
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
NSMutableCharacterSet *tmpCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"/>"];
[tmpCharacterSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

_nonQuotedAttributeEndCharacterSet = [tmpCharacterSet copy];
});
#else
if (!_nonQuotedAttributeEndCharacterSet)
{
NSMutableCharacterSet *tmpCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"/>"];
[tmpCharacterSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

_nonQuotedAttributeEndCharacterSet = [tmpCharacterSet copy];
}
#endif

return _nonQuotedAttributeEndCharacterSet;
}
Expand Down
Loading

0 comments on commit e5e1568

Please sign in to comment.