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

Reply via email to