Author: rfm
Date: Tue May 13 13:01:50 2014
New Revision: 37879
URL: http://svn.gna.org/viewcvs/gnustep?rev=37879&view=rev
Log:
more thread-safety changes
Modified:
libs/sqlclient/trunk/ChangeLog
libs/sqlclient/trunk/SQLClient.m
Modified: libs/sqlclient/trunk/ChangeLog
URL:
http://svn.gna.org/viewcvs/gnustep/libs/sqlclient/trunk/ChangeLog?rev=37879&r1=37878&r2=37879&view=diff
==============================================================================
--- libs/sqlclient/trunk/ChangeLog (original)
+++ libs/sqlclient/trunk/ChangeLog Tue May 13 13:01:50 2014
@@ -4,6 +4,7 @@
Fix tiny window in which a connection could be unlocked yet have
the flag set to say it is in a transaction (thus potentially
allowing a locking consistency error).
+ Add locking to protect setting/changing configuration.
2014-05-08 Richard Frith-Macdonald <[email protected]>
Modified: libs/sqlclient/trunk/SQLClient.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/sqlclient/trunk/SQLClient.m?rev=37879&r1=37878&r2=37879&view=diff
==============================================================================
--- libs/sqlclient/trunk/SQLClient.m (original)
+++ libs/sqlclient/trunk/SQLClient.m Tue May 13 13:01:50 2014
@@ -1155,10 +1155,10 @@
- (BOOL) connect
{
- if (connected == NO)
+ if (NO == connected)
{
[lock lock];
- if (connected == NO)
+ if (NO == connected)
{
NS_DURING
{
@@ -1199,9 +1199,9 @@
}
NS_HANDLER
{
- [lock unlock];
_lastOperation = GSTickerTimeNow();
_connectFails++;
+ [lock unlock];
[localException raise];
}
NS_ENDHANDLER
@@ -1315,7 +1315,7 @@
- (void) disconnect
{
- if (connected == YES)
+ if (YES == connected)
{
NSNotificationCenter *nc;
@@ -1330,7 +1330,7 @@
_inTransaction = NO;
[lock unlock];
}
- if (connected == YES)
+ if (YES == connected)
{
NS_DURING
{
@@ -1773,72 +1773,97 @@
- (void) setDatabase: (NSString*)s
{
- if ([s isEqual: _database] == NO)
- {
- if (connected == YES)
- {
- [self disconnect];
- }
- s = [s copy];
- [_database release];
- _database = s;
- }
+ [lock lock];
+ NS_DURING
+ {
+ if ([s isEqual: _database] == NO)
+ {
+ if (connected == YES)
+ {
+ [self disconnect];
+ }
+ s = [s copy];
+ [_database release];
+ _database = s;
+ }
+ }
+ NS_HANDLER
+ {
+ [lock unlock];
+ [localException raise];
+ }
+ NS_ENDHANDLER
+ [lock unlock];
}
- (void) setName: (NSString*)s
{
- if ([s isEqual: _name] == NO)
- {
- [lock lock];
- if ([s isEqual: _name] == YES)
- {
- [lock unlock];
- return;
- }
- [clientsMapLock lock];
- if (NSMapGet(clientsMap, s) != 0)
- {
- [lock unlock];
- [clientsMapLock unlock];
- if ([self debugging] > 0)
- {
- [self debug: @"Error attempt to re-use client name %@", s];
- }
- return;
- }
- if (connected == YES)
- {
- [self disconnect];
- }
- [self retain];
- if (_name != nil)
- {
- NSMapRemove(clientsMap, (void*)_name);
+ [lock lock];
+ NS_DURING
+ {
+ if ([s isEqual: _name] == NO)
+ {
+ [clientsMapLock lock];
+ if (NSMapGet(clientsMap, s) != 0)
+ {
+ [clientsMapLock unlock];
+ [lock unlock];
+ if ([self debugging] > 0)
+ {
+ [self debug: @"Error attempt to re-use client name %@", s];
+ }
+ NS_VOIDRETURN;
+ }
+ if (connected == YES)
+ {
+ [self disconnect];
+ }
+ if (_name != nil)
+ {
+ [[self retain] autorelease];
+ NSMapRemove(clientsMap, (void*)_name);
+ }
+ s = [s copy];
+ [_name release];
+ _name = s;
+ [_client release];
+ _client = [[[NSProcessInfo processInfo] globallyUniqueString]
retain];
+ NSMapInsert(clientsMap, (void*)_name, (void*)self);
+ [clientsMapLock unlock];
}
- s = [s copy];
- [_name release];
- _name = s;
- [_client release];
- _client = [[[NSProcessInfo processInfo] globallyUniqueString] retain];
- NSMapInsert(clientsMap, (void*)_name, (void*)self);
- [clientsMapLock unlock];
+ }
+ NS_HANDLER
+ {
[lock unlock];
- [self release];
- }
+ [localException raise];
+ }
+ NS_ENDHANDLER
+ [lock unlock];
}
- (void) setPassword: (NSString*)s
{
- if ([s isEqual: _password] == NO)
- {
- if (connected == YES)
- {
- [self disconnect];
- }
- s = [s copy];
- [_password release];
- _password = s;
- }
+ [lock lock];
+ NS_DURING
+ {
+ if ([s isEqual: _password] == NO)
+ {
+ if (connected == YES)
+ {
+ [self disconnect];
+ }
+ s = [s copy];
+ [_password release];
+ _password = s;
+ }
+ }
+ NS_HANDLER
+ {
+ [lock unlock];
+ [localException raise];
+ }
+ NS_ENDHANDLER
+ [lock unlock];
}
- (void) setShouldTrim: (BOOL)aFlag
@@ -1848,16 +1873,27 @@
- (void) setUser: (NSString*)s
{
- if ([s isEqual: _client] == NO)
- {
- if (connected == YES)
- {
- [self disconnect];
- }
- s = [s copy];
- [_user release];
- _user = s;
- }
+ [lock lock];
+ NS_DURING
+ {
+ if ([s isEqual: _client] == NO)
+ {
+ if (connected == YES)
+ {
+ [self disconnect];
+ }
+ s = [s copy];
+ [_user release];
+ _user = s;
+ }
+ }
+ NS_HANDLER
+ {
+ [lock unlock];
+ [localException raise];
+ }
+ NS_ENDHANDLER
+ [lock unlock];
}
- (NSInteger) simpleExecute: (NSArray*)info
@@ -2778,7 +2814,7 @@
GSCache *c;
[lock lock];
- if (_cache == nil)
+ if (nil == _cache)
{
_cache = [GSCache new];
if (_cacheThread != nil)
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs