Fix deadlock and revert previous change

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@26603 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2008-06-07 05:44:58 +00:00
parent 220bf8f040
commit 62564278d7
7 changed files with 43 additions and 25 deletions

View file

@ -1,13 +1,7 @@
2008-06-07 Richard Frith-Macdonald <rfm@gnu.org> 2008-06-07 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSCalendarDate.m:
* Source/NSUserDefaults.m: * Source/NSUserDefaults.m:
* Source/GSPrivate.h: Fix possible deadlock reported by Larry Campbell
* Source/NSString.m:
* Source/NSDecimalNumber.m:
* Source/NSDate.m:
Remove GSPrivateDefaultLocale(), as the performance optimisation
doesn't seem worth the additional complexity.
2008-06-06 Richard Frith-Macdonald <rfm@gnu.org> 2008-06-06 Richard Frith-Macdonald <rfm@gnu.org>

View file

@ -318,6 +318,12 @@ GSPrivateCheckTasks(void) GS_ATTRIB_PRIVATE;
NSStringEncoding NSStringEncoding
GSPrivateDefaultCStringEncoding() GS_ATTRIB_PRIVATE; GSPrivateDefaultCStringEncoding() GS_ATTRIB_PRIVATE;
/* Get default locale quickly (usually from cache).
* External apps would cache the locale themselves.
*/
NSDictionary *
GSPrivateDefaultLocale() GS_ATTRIB_PRIVATE;
/* Get one of several standard values. /* Get one of several standard values.
*/ */
BOOL BOOL

View file

@ -673,7 +673,7 @@ static inline int getDigits(const char *from, char *to, int limit, BOOL *error)
sourceLen = strlen(source); sourceLen = strlen(source);
if (locale == nil) if (locale == nil)
{ {
locale = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; locale = GSPrivateDefaultLocale();
} }
if (fmt == nil) if (fmt == nil)
{ {
@ -2267,7 +2267,7 @@ static void Grow(DescriptionInfo *info, unsigned size)
DescriptionInfo info; DescriptionInfo info;
if (locale == nil) if (locale == nil)
locale = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; locale = GSPrivateDefaultLocale();
if (format == nil) if (format == nil)
format = [locale objectForKey: NSTimeDateFormatString]; format = [locale objectForKey: NSTimeDateFormatString];

View file

@ -264,7 +264,7 @@ otherTime(NSDate* other)
if (locale == nil) if (locale == nil)
{ {
locale = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; locale = GSPrivateDefaultLocale();
} }
ws = [NSCharacterSet whitespaceAndNewlineCharacterSet]; ws = [NSCharacterSet whitespaceAndNewlineCharacterSet];
digits = [NSCharacterSet decimalDigitCharacterSet]; digits = [NSCharacterSet decimalDigitCharacterSet];

View file

@ -35,7 +35,6 @@
#include "Foundation/NSDecimalNumber.h" #include "Foundation/NSDecimalNumber.h"
#include "Foundation/NSException.h" #include "Foundation/NSException.h"
#include "Foundation/NSPortCoder.h" #include "Foundation/NSPortCoder.h"
#include "Foundation/NSUserDefaults.h"
#include "GSPrivate.h" #include "GSPrivate.h"
@ -357,9 +356,8 @@ static NSDecimalNumber *one;
float v = *(float *)value; float v = *(float *)value;
if (GSIsNAN(v)) return notANumber; if (GSIsNAN(v)) return notANumber;
if (GSIsInf(v)) return (v < 0.0) ? minNumber : maxNumber; if (GSIsInf(v)) return (v < 0.0) ? minNumber : maxNumber;
s = [[NSString alloc] initWithFormat: @"%g" locale: s = [[NSString alloc] initWithFormat: @"%g"
[[NSUserDefaults standardUserDefaults] dictionaryRepresentation], locale: GSPrivateDefaultLocale(), (double)v];
(double)v];
self = [self initWithString: s]; self = [self initWithString: s];
RELEASE(s); RELEASE(s);
return self; return self;
@ -372,9 +370,8 @@ static NSDecimalNumber *one;
double v = *(double *)value; double v = *(double *)value;
if (GSIsNAN(v)) return notANumber; if (GSIsNAN(v)) return notANumber;
if (GSIsInf(v)) return (v < 0.0) ? minNumber : maxNumber; if (GSIsInf(v)) return (v < 0.0) ? minNumber : maxNumber;
s = [[NSString alloc] initWithFormat: @"%g" locale: s = [[NSString alloc] initWithFormat: @"%g"
[[NSUserDefaults standardUserDefaults] dictionaryRepresentation], locale: GSPrivateDefaultLocale(), v];
v];
self = [self initWithString: s]; self = [self initWithString: s];
RELEASE(s); RELEASE(s);
return self; return self;
@ -416,7 +413,7 @@ static NSDecimalNumber *one;
- (id) initWithString: (NSString*)numberValue - (id) initWithString: (NSString*)numberValue
{ {
return [self initWithString: numberValue return [self initWithString: numberValue
locale: [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]]; locale: GSPrivateDefaultLocale()];
} }
- (id) initWithString: (NSString*)numberValue - (id) initWithString: (NSString*)numberValue

View file

@ -4384,9 +4384,7 @@ static NSFileManager *fm = nil;
else else
{ {
ret = AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] ret = AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()]
initWithFormat: format locale: initWithFormat: format locale: GSPrivateDefaultLocale() arguments: ap]);
[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]
arguments: ap]);
} }
va_end(ap); va_end(ap);
return ret; return ret;
@ -4439,8 +4437,7 @@ static NSFileManager *fm = nil;
return [self compare: string return [self compare: string
options: 0 options: 0
range: ((NSRange){0, [self length]}) range: ((NSRange){0, [self length]})
locale: locale: GSPrivateDefaultLocale()];
[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
} }
/** /**
@ -4452,8 +4449,7 @@ static NSFileManager *fm = nil;
return [self compare: string return [self compare: string
options: NSCaseInsensitiveSearch options: NSCaseInsensitiveSearch
range: ((NSRange){0, [self length]}) range: ((NSRange){0, [self length]})
locale: locale: GSPrivateDefaultLocale()];
[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
} }
/** /**

View file

@ -1872,3 +1872,28 @@ GSPrivateDefaultsFlag(GSUserDefaultFlagType type)
return flags[type]; return flags[type];
} }
/* FIXME ... Slightly faster than
* [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]
* but is it really worthwile?
*/
NSDictionary *GSPrivateDefaultLocale()
{
NSDictionary *locale;
NSUserDefaults *defs;
if (classLock == nil)
{
[NSUserDefaults standardUserDefaults];
}
[classLock lock];
if (sharedDefaults == nil)
{
[NSUserDefaults standardUserDefaults];
}
defs = [sharedDefaults retain];
[classLock unlock];
locale = [defs dictionaryRepresentation];
[defs release];
return locale;
}