From c1d4551ae1d63cfbff5db7b5fdec94f0357dff7b Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 23 May 2006 22:13:19 +0000 Subject: [PATCH] Add PQisthreadsafe() to libpq, to allow library applications to query the thread-safety status of the library. --- doc/src/sgml/libpq.sgml | 27 ++++++++++++++++++++++++--- src/interfaces/libpq/exports.txt | 4 +++- src/interfaces/libpq/fe-exec.c | 14 +++++++++++++- src/interfaces/libpq/libpq-fe.h | 3 ++- 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 0c24f2b773d..229e9d5a28f 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -1,4 +1,4 @@ - + <application>libpq</application> - C Library @@ -4196,11 +4196,32 @@ options when you compile your application code. Refer to your system's documentation for information about how to build thread-enabled applications, or look in src/Makefile.global for PTHREAD_CFLAGS -and PTHREAD_LIBS. +and PTHREAD_LIBS. This function allows the querying of +libpq's thread-safe status: + + +PQisthreadsafePQisthreadsafe + + + Returns the thread safety status of the libpq + library. + +int PQisthreadsafe(); + + + + + Returns 1 if the libpq is thead-safe and + 0 if it is not. + + + + + -One restriction is that no two threads attempt to manipulate the same +One thread restriction is that no two threads attempt to manipulate the same PGconn object at the same time. In particular, you cannot issue concurrent commands from different threads through the same connection object. (If you need to run concurrent commands, use diff --git a/src/interfaces/libpq/exports.txt b/src/interfaces/libpq/exports.txt index 7fcd43b01aa..b50d062c0bc 100644 --- a/src/interfaces/libpq/exports.txt +++ b/src/interfaces/libpq/exports.txt @@ -1,4 +1,4 @@ -# $PostgreSQL: pgsql/src/interfaces/libpq/exports.txt,v 1.8 2006/05/21 20:19:23 tgl Exp $ +# $PostgreSQL: pgsql/src/interfaces/libpq/exports.txt,v 1.9 2006/05/23 22:13:19 momjian Exp $ # Functions to be exported by libpq DLLs PQconnectdb 1 PQsetdbLogin 2 @@ -128,3 +128,5 @@ PQregisterThreadLock 125 PQescapeStringConn 126 PQescapeByteaConn 127 PQencryptPassword 128 +PQisthreadsafe 129 + diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 31393989468..7b999c85330 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.183 2006/05/21 20:19:23 tgl Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.184 2006/05/23 22:13:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -2343,6 +2343,18 @@ PQisnonblocking(const PGconn *conn) return pqIsnonblocking(conn); } +/* libpq is thread-safe? */ +int +PQisthreadsafe(void) +{ +#ifdef ENABLE_THREAD_SAFETY + return true; +#else + return false; +#endif +} + + /* try to force data out, really only useful for non-blocking users */ int PQflush(PGconn *conn) diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index c309448bacf..3b824efe852 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/interfaces/libpq/libpq-fe.h,v 1.128 2006/05/21 20:19:23 tgl Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/libpq-fe.h,v 1.129 2006/05/23 22:13:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -366,6 +366,7 @@ extern int PQendcopy(PGconn *conn); /* Set blocking/nonblocking connection to the backend */ extern int PQsetnonblocking(PGconn *conn, int arg); extern int PQisnonblocking(const PGconn *conn); +extern int PQisthreadsafe(void); /* Force the write buffer to be written (or at least try) */ extern int PQflush(PGconn *conn); -- 2.39.5