Minor thread safety fixup

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@25774 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2007-12-21 14:37:37 +00:00
parent 2ef54f7ef2
commit ab9404b6a3
3 changed files with 18 additions and 5 deletions

View file

@ -1,3 +1,7 @@
2007-12-21 Richard Frith-Macdonald <rfm@gnu.org>
* Source/GSLocale.m: protect locale access with locks.
2007-12-21 David Ayers <ayers@fsfe.org> 2007-12-21 David Ayers <ayers@fsfe.org>
* Source/NSPathUtilities.m (_POSIX_PTHREAD_SEMANTICS): Define to expose * Source/NSPathUtilities.m (_POSIX_PTHREAD_SEMANTICS): Define to expose

View file

@ -108,6 +108,11 @@ GSDomainFromDefaultLocale(void)
dict = [NSMutableDictionary dictionary]; dict = [NSMutableDictionary dictionary];
/* Protect locale access with locks to prevent multiple threads using
* it and interfering with the buffer.
*/
[gnustep_global_lock lock];
#ifdef HAVE_LANGINFO_H #ifdef HAVE_LANGINFO_H
/* Time/Date Information */ /* Time/Date Information */
arr = [NSMutableArray arrayWithCapacity: 7]; arr = [NSMutableArray arrayWithCapacity: 7];
@ -189,7 +194,6 @@ GSDomainFromDefaultLocale(void)
forKey: NSThousandsSeparator]; forKey: NSThousandsSeparator];
} }
/* FIXME: Get currency format from localeconv */ /* FIXME: Get currency format from localeconv */
#ifdef LC_MESSAGES #ifdef LC_MESSAGES
@ -207,7 +211,6 @@ GSDomainFromDefaultLocale(void)
[dict setObject: str2 forKey: NSLanguageName]; [dict setObject: str2 forKey: NSLanguageName];
} }
[gnustep_global_lock lock];
/* /*
* Another thread might have been faster in setting the static variable. * Another thread might have been faster in setting the static variable.
* If so, we just drop our dict. * If so, we just drop our dict.

View file

@ -266,14 +266,20 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
{ {
NSDictionary *regDefs; NSDictionary *regDefs;
[sharedDefaults synchronize]; // Ensure changes are written.
regDefs = RETAIN([sharedDefaults->_tempDomains
objectForKey: NSRegistrationDomain]);
/* To ensure that we don't try to synchronise the old defaults to disk /* To ensure that we don't try to synchronise the old defaults to disk
* after creating the new ones, remove as housekeeping notification * after creating the new ones, remove as housekeeping notification
* observer. * observer.
*/ */
[[NSNotificationCenter defaultCenter] removeObserver: sharedDefaults]; [[NSNotificationCenter defaultCenter] removeObserver: sharedDefaults];
/* Ensure changes are written, and no changes left so we can't end up
* writing old changes to the new defaults.
*/
[sharedDefaults synchronize];
DESTROY(sharedDefaults->_changedDomains);
regDefs = RETAIN([sharedDefaults->_tempDomains
objectForKey: NSRegistrationDomain]);
setSharedDefaults = NO; setSharedDefaults = NO;
DESTROY(sharedDefaults); DESTROY(sharedDefaults);
if (regDefs != nil) if (regDefs != nil)