]> granicus.if.org Git - postgresql/commitdiff
Added patch by Philip Yarra <philip.yarra@internode.on.net> for a bug in thread support.
authorMichael Meskes <meskes@postgresql.org>
Thu, 14 Apr 2005 10:08:57 +0000 (10:08 +0000)
committerMichael Meskes <meskes@postgresql.org>
Thu, 14 Apr 2005 10:08:57 +0000 (10:08 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/ecpglib/connect.c

index ecd7bc6026e6b901410ec91f28c516cb25df4122..c16392265b3a7856536ac9ae8cfd04817753a8cf 100644 (file)
@@ -1918,6 +1918,11 @@ Fri Mar 18 10:54:47 CET 2005
          
        - Added patch by Christof Petig <christof@petig-baender.de> to work
          around gcc bug on powerpc and amd64.
+
+Thu Apr 14 11:59:47 CEST 2005
+
+       - Added patch by Philip Yarra <philip.yarra@internode.on.net> for a
+         bug in thread support.
        - Set ecpg library version to 5.1.
        - Set ecpg version to 4.1.1.
 
index 6a621f99af8ac8125e70f9032e32f73497713893..56706fb8ef2e5b2e77a21038b854674df42acc39 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.24 2004/12/30 09:36:37 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.25 2005/04/14 10:08:57 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -17,9 +17,8 @@ static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_key_t actual_connection_key;
 static pthread_once_t actual_connection_key_once = PTHREAD_ONCE_INIT;
 
-#else
-static struct connection *actual_connection = NULL;
 #endif
+static struct connection *actual_connection = NULL;
 static struct connection *all_connections = NULL;
 
 #ifdef ENABLE_THREAD_SAFETY
@@ -39,6 +38,16 @@ ecpg_get_connection_nr(const char *connection_name)
        {
 #ifdef ENABLE_THREAD_SAFETY
                ret = pthread_getspecific(actual_connection_key);
+               /* if no connection in TSD for this thread, get the global default connection
+                * and hope the user knows what they're doing (i.e. using their own mutex to
+                * protect that connection from concurrent accesses */
+               if(NULL == ret)
+               {
+                       ECPGlog("no TSD connection, going for global\n");
+                       ret = actual_connection;
+               }
+               else
+                       ECPGlog("got the TSD connection\n");
 #else
                ret = actual_connection;
 #endif
@@ -67,6 +76,16 @@ ECPGget_connection(const char *connection_name)
        {
 #ifdef ENABLE_THREAD_SAFETY
                ret = pthread_getspecific(actual_connection_key);
+               /* if no connection in TSD for this thread, get the global default connection
+         * and hope the user knows what they're doing (i.e. using their own mutex to
+         * protect that connection from concurrent accesses */
+        if(NULL == ret)
+               {
+                       ECPGlog("no TSD connection here either, using global\n");
+            ret = actual_connection;
+               }
+               else
+                       ECPGlog("got TSD connection\n");
 #else
                ret = actual_connection;
 #endif
@@ -117,10 +136,9 @@ ecpg_finish(struct connection * act)
 #ifdef ENABLE_THREAD_SAFETY
                if (pthread_getspecific(actual_connection_key) == act)
                        pthread_setspecific(actual_connection_key, all_connections);
-#else
+#endif
                if (actual_connection == act)
                        actual_connection = all_connections;
-#endif
 
                ECPGlog("ecpg_finish: Connection %s closed.\n", act->name);
 
@@ -416,9 +434,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
 #ifdef ENABLE_THREAD_SAFETY
        pthread_once(&actual_connection_key_once, ecpg_actual_connection_init);
        pthread_setspecific(actual_connection_key, all_connections);
-#else
-       actual_connection = all_connections;
 #endif
+       actual_connection = all_connections;
 
        ECPGlog("ECPGconnect: opening database %s on %s port %s %s%s%s%s\n",
                        realname ? realname : "<DEFAULT>",