Don't update unless needed

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@4275 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
richard 1999-05-20 19:11:21 +00:00
parent f5590809e2
commit d78c8a8c86
3 changed files with 91 additions and 43 deletions

View file

@ -1,3 +1,8 @@
Thu May 20 20:30:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSUserDefaults.m: Don't load defaults unless we need to.
* Source/include/NSUserDefaults.h: Keep modification timestamp.
Thu May 20 10:50:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk> Thu May 20 10:50:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/GSeq.h: Add support for comparison and search. * Source/GSeq.h: Add support for comparison and search.

View file

@ -119,6 +119,7 @@ extern NSString* const NSDateTimeOrdering;
NSMutableString *defaultsDatabase; NSMutableString *defaultsDatabase;
NSMutableString *defaultsDatabaseLockName; NSMutableString *defaultsDatabaseLockName;
NSDistributedLock *defaultsDatabaseLock; NSDistributedLock *defaultsDatabaseLock;
NSDate *lastSync;
NSTimer *tickingTimer; // for synchronization NSTimer *tickingTimer; // for synchronization
} }

View file

@ -87,7 +87,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
setSharedDefaults = NO; setSharedDefaults = NO;
sharedDefaults = nil; sharedDefaults = nil;
[defs release]; RELEASE(defs);
} }
+ (NSUserDefaults *)standardUserDefaults + (NSUserDefaults *)standardUserDefaults
@ -232,7 +232,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
if (env_list) if (env_list)
{ {
env = [NSString stringWithCString: env_list]; env = [NSString stringWithCString: env_list];
currLang = [[env componentsSeparatedByString: @";"] retain]; currLang = RETAIN([env componentsSeparatedByString: @";"]);
} }
} }
if (currLang) if (currLang)
@ -282,7 +282,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
// Either userName is empty or it's wrong // Either userName is empty or it's wrong
if (!userHome) if (!userHome)
{ {
[self release]; RELEASE(self);
return nil; return nil;
} }
filename = [NSString stringWithFormat: @"%@/%@", filename = [NSString stringWithFormat: @"%@/%@",
@ -300,37 +300,40 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
if (!defaultsDatabase) if (!defaultsDatabase)
{ {
if (path != nil && [path isEqual: @""] == NO) if (path != nil && [path isEqual: @""] == NO)
defaultsDatabase = [path copy]; defaultsDatabase = (NSMutableString*)[path mutableCopy];
else else
defaultsDatabase = {
[[NSMutableString stringWithFormat: @"%@/%@", defaultsDatabase =
(NSMutableString*)[NSMutableString stringWithFormat: @"%@/%@",
NSHomeDirectoryForUser(NSUserName()), NSHomeDirectoryForUser(NSUserName()),
GNU_UserDefaultsDatabase] retain]; GNU_UserDefaultsDatabase];
RETAIN(defaultsDatabase);
}
if ([[defaultsDatabase lastPathComponent] isEqual: if ([[defaultsDatabase lastPathComponent] isEqual:
[GNU_UserDefaultsDatabase lastPathComponent]] == YES) [GNU_UserDefaultsDatabase lastPathComponent]] == YES)
defaultsDatabaseLockName = defaultsDatabaseLockName =
[[NSMutableString stringWithFormat: @"%@/%@", (NSMutableString*)[NSMutableString stringWithFormat: @"%@/%@",
[defaultsDatabase stringByDeletingLastPathComponent], [defaultsDatabase stringByDeletingLastPathComponent],
[GNU_UserDefaultsDatabaseLock lastPathComponent]] [GNU_UserDefaultsDatabaseLock lastPathComponent]];
retain];
else else
defaultsDatabaseLockName = defaultsDatabaseLockName =
[[NSMutableString stringWithFormat: @"%@/%@", (NSMutableString*)[NSMutableString stringWithFormat: @"%@/%@",
NSHomeDirectoryForUser(NSUserName()), NSHomeDirectoryForUser(NSUserName()),
GNU_UserDefaultsDatabaseLock] retain]; GNU_UserDefaultsDatabaseLock];
RETAIN(defaultsDatabaseLockName);
defaultsDatabaseLock = defaultsDatabaseLock =
[[NSDistributedLock lockWithPath: defaultsDatabaseLockName] retain]; RETAIN([NSDistributedLock lockWithPath: defaultsDatabaseLockName]);
} }
if (processName == nil) if (processName == nil)
processName = [[[[NSProcessInfo processInfo] processName] processName = RETAIN([[[NSProcessInfo processInfo] processName]
lastPathComponent] retain]; lastPathComponent]);
// Create an empty search list // Create an empty search list
searchList = [[NSMutableArray arrayWithCapacity: 10] retain]; searchList = [[NSMutableArray alloc] initWithCapacity: 10];
// Initialize persDomains from the archived user defaults (persistent) // Initialize persDomains from the archived user defaults (persistent)
persDomains = [[NSMutableDictionary dictionaryWithCapacity: 10] retain]; persDomains = [[NSMutableDictionary alloc] initWithCapacity: 10];
if ([self synchronize] == NO) if ([self synchronize] == NO)
{ {
NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
@ -347,7 +350,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
} }
if (done == NO) if (done == NO)
{ {
[self release]; RELEASE(self);
return self = nil; return self = nil;
} }
} }
@ -369,7 +372,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
} }
// Create volatile defaults and add the Argument and the Registration domains // Create volatile defaults and add the Argument and the Registration domains
tempDomains = [[NSMutableDictionary dictionaryWithCapacity: 10] retain]; tempDomains = [[NSMutableDictionary alloc] initWithCapacity: 10];
[tempDomains setObject: [self __createArgumentDictionary] [tempDomains setObject: [self __createArgumentDictionary]
forKey: NSArgumentDomain]; forKey: NSArgumentDomain];
[tempDomains setObject: [tempDomains setObject:
@ -383,11 +386,12 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
{ {
if (tickingTimer) if (tickingTimer)
[tickingTimer invalidate]; [tickingTimer invalidate];
[searchList release]; RELEASE(lastSync);
[persDomains release]; RELEASE(searchList);
[tempDomains release]; RELEASE(persDomains);
[changedDomains release]; RELEASE(tempDomains);
[dictionaryRep release]; RELEASE(changedDomains);
RELEASE(dictionaryRep);
[super dealloc]; [super dealloc];
} }
@ -589,7 +593,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
- (void)setSearchList: (NSArray*)newList - (void)setSearchList: (NSArray*)newList
{ {
DESTROY(dictionaryRep); DESTROY(dictionaryRep);
[searchList release]; RELEASE(searchList);
searchList = [newList mutableCopy]; searchList = [newList mutableCopy];
} }
@ -635,18 +639,50 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
- (BOOL) synchronize - (BOOL) synchronize
{ {
NSMutableDictionary *newDict = nil; NSFileManager *mgr = [NSFileManager defaultManager];
NSMutableDictionary *newDict = nil;
NSDictionary *attr;
NSDate *mod;
if (tickingTimer == nil) if (tickingTimer == nil)
{ {
tickingTimer = [NSTimer scheduledTimerWithTimeInterval: 30 tickingTimer = [NSTimer scheduledTimerWithTimeInterval: 30
target: self target: self
selector: @selector(__timerTicked: ) selector: @selector(__timerTicked:)
userInfo: nil userInfo: nil
repeats: NO]; repeats: NO];
} }
// Get file lock - break any lock that is more than five minute old. /*
* If we haven't changed anything, we only need to synchronise if
* the on-disk database has been changed by someone else.
*/
if (changedDomains == NO)
{
BOOL wantRead = NO;
if (lastSync == nil)
wantRead = YES;
else
{
attr = [mgr fileAttributesAtPath: defaultsDatabase
traverseLink: YES];
if (attr == nil)
wantRead = YES;
else
{
mod = [attr objectForKey: NSFileModificationDate];
if ([lastSync earlierDate: mod] != lastSync)
wantRead = YES;
}
}
if (wantRead == NO)
return;
}
/*
* Get file lock - break any lock that is more than five minute old.
*/
if ([defaultsDatabaseLock tryLock] == NO) if ([defaultsDatabaseLock tryLock] == NO)
{ {
if ([[defaultsDatabaseLock lockDate] timeIntervalSinceNow] < -300.0) if ([[defaultsDatabaseLock lockDate] timeIntervalSinceNow] < -300.0)
@ -666,21 +702,19 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
DESTROY(dictionaryRep); DESTROY(dictionaryRep);
// Read the persistent data from the stored database // Read the persistent data from the stored database
if ([[NSFileManager defaultManager] fileExistsAtPath: defaultsDatabase]) if ([mgr fileExistsAtPath: defaultsDatabase])
{ {
newDict = [[NSMutableDictionary allocWithZone: [self zone]] newDict = [[NSMutableDictionary allocWithZone: [self zone]]
initWithContentsOfFile: defaultsDatabase]; initWithContentsOfFile: defaultsDatabase];
} }
else else
{ {
NSDictionary *attr;
attr = [NSDictionary dictionaryWithObjectsAndKeys: attr = [NSDictionary dictionaryWithObjectsAndKeys:
NSUserName(), NSFileOwnerAccountName, nil]; NSUserName(), NSFileOwnerAccountName, nil];
NSLog(@"Creating defaults database file %@", defaultsDatabase); NSLog(@"Creating defaults database file %@", defaultsDatabase);
[[NSFileManager defaultManager] createFileAtPath: defaultsDatabase [mgr createFileAtPath: defaultsDatabase
contents: nil contents: nil
attributes: attr]; attributes: attr];
[[NSDictionary dictionary] writeToFile: defaultsDatabase atomically: YES]; [[NSDictionary dictionary] writeToFile: defaultsDatabase atomically: YES];
} }
@ -707,7 +741,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
[newDict removeObjectForKey: obj]; [newDict removeObjectForKey: obj];
} }
} }
[persDomains release]; RELEASE(persDomains);
persDomains = newDict; persDomains = newDict;
// Save the changes // Save the changes
if (![persDomains writeToFile: defaultsDatabase atomically: YES]) if (![persDomains writeToFile: defaultsDatabase atomically: YES])
@ -715,14 +749,22 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
[defaultsDatabaseLock unlock]; [defaultsDatabaseLock unlock];
return NO; return NO;
} }
attr = [mgr fileAttributesAtPath: defaultsDatabase
traverseLink: YES];
mod = [attr objectForKey: NSFileModificationDate];
ASSIGN(lastSync, mod);
[defaultsDatabaseLock unlock]; // release file lock [defaultsDatabaseLock unlock]; // release file lock
} }
else else
{ {
attr = [mgr fileAttributesAtPath: defaultsDatabase
traverseLink: YES];
mod = [attr objectForKey: NSFileModificationDate];
ASSIGN(lastSync, mod);
[defaultsDatabaseLock unlock]; // release file lock [defaultsDatabaseLock unlock]; // release file lock
if ([persDomains isEqual: newDict] == NO) if ([persDomains isEqual: newDict] == NO)
{ {
[persDomains release]; RELEASE(persDomains);
persDomains = newDict; persDomains = newDict;
[[NSNotificationCenter defaultCenter] [[NSNotificationCenter defaultCenter]
postNotificationName: NSUserDefaultsDidChangeNotification postNotificationName: NSUserDefaultsDidChangeNotification
@ -730,7 +772,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
} }
else else
{ {
[newDict release]; RELEASE(newDict);
} }
} }
@ -796,7 +838,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
[dictRep addEntriesFromDictionary: dict]; [dictRep addEntriesFromDictionary: dict];
} }
dictionaryRep = [dictRep copy]; dictionaryRep = [dictRep copy];
[dictRep release]; RELEASE(dictRep);
} }
return dictionaryRep; return dictionaryRep;
} }
@ -900,7 +942,7 @@ static BOOL setSharedDefaults = NO; /* Flag to prevent infinite recursion */
DESTROY(dictionaryRep); DESTROY(dictionaryRep);
if (!changedDomains) if (!changedDomains)
{ {
changedDomains = [[NSMutableArray arrayWithCapacity: 5] retain]; changedDomains = [[NSMutableArray alloc] initWithCapacity: 5];
[[NSNotificationCenter defaultCenter] [[NSNotificationCenter defaultCenter]
postNotificationName: NSUserDefaultsDidChangeNotification object: nil]; postNotificationName: NSUserDefaultsDidChangeNotification object: nil];
} }