From: Michael Meskes Date: Thu, 14 Apr 2005 10:08:57 +0000 (+0000) Subject: Added patch by Philip Yarra for a bug in thread support. X-Git-Tag: REL8_1_0BETA1~1024 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9dc2e6deaf66f97ff9157478a517d0f48a1e5060;p=postgresql Added patch by Philip Yarra for a bug in thread support. --- diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index ecd7bc6026..c16392265b 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1918,6 +1918,11 @@ Fri Mar 18 10:54:47 CET 2005 - Added patch by Christof Petig to work around gcc bug on powerpc and amd64. + +Thu Apr 14 11:59:47 CEST 2005 + + - Added patch by Philip Yarra for a + bug in thread support. - Set ecpg library version to 5.1. - Set ecpg version to 4.1.1. diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c index 6a621f99af..56706fb8ef 100644 --- a/src/interfaces/ecpg/ecpglib/connect.c +++ b/src/interfaces/ecpg/ecpglib/connect.c @@ -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 : "",