aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/ecpglib/connect.c
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2005-04-14 10:08:57 +0000
committerMichael Meskes <meskes@postgresql.org>2005-04-14 10:08:57 +0000
commit9dc2e6deaf66f97ff9157478a517d0f48a1e5060 (patch)
treec4f9816f3d1aae5865e8aceff0ed515471371a1e /src/interfaces/ecpg/ecpglib/connect.c
parent7c13781ee7a617235f24617e3bd7628cda95df15 (diff)
downloadpostgresql-9dc2e6deaf66f97ff9157478a517d0f48a1e5060.tar.gz
postgresql-9dc2e6deaf66f97ff9157478a517d0f48a1e5060.zip
Added patch by Philip Yarra <philip.yarra@internode.on.net> for a bug in thread support.
Diffstat (limited to 'src/interfaces/ecpg/ecpglib/connect.c')
-rw-r--r--src/interfaces/ecpg/ecpglib/connect.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index 6a621f99af8..56706fb8ef2 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 : "<DEFAULT>",