Applied, with updated exports.txt value. ---------------------------------------------------------------------------
Bruce Momjian wrote: > [EMAIL PROTECTED] wrote: > > From: Bruce Momjian <pgman@candle.pha.pa.us> > > > [EMAIL PROTECTED] wrote: > > > > Hi all > > > > > > > > I am writing an app that uses libpq, but because it is threaded I want > > > > to make sure that the dynamic > > > > library being used has been compiled with the right option. > > > > How do I do this? > > > > > > > > Is there a call such as "bool PQisThreadSafe()" that I can call? > > > > > Is this like detecting of libpq is SSL-enabled? I see PQgetssl(). Do > > > we need to add a libpq function to return true/false for threading? > > > Slony requires a threaded libpq, so it could do the test to prevent > > > wrong configurations. It would be nice to enabled threading by default, > > > but it is like SSL in that not all operating systems support it. > > > > Yes, this is exactly the issue I have: I want to enforce at runtime that > > the library being > > used is correct. > > btw, I noticed that for some reason the prebuild linux rpms for Fedora Core > > 3 are compiled > > without pthread support (and that's how I found out that I had to check the > > library on startup as I was getting strange lockups). > > I think the simplest is to add a new call just like the one you described > > for testing for ssl and tell people > > to call this function if they need the library to be thread safe. > > Having heard no demand for libpq checking beyond threading, I have > implemented PQisthreadsafe(). I used PQisnonblocking() as an example. > > One major argument for having a separate function, aside from lack of > demand for more, is that we are probably nearing the day when a theaded > libpq will be created by default on platforms that support it, and in > that case, there might not be a configure flag to check. > > -- > Bruce Momjian http://candle.pha.pa.us > EnterpriseDB http://www.enterprisedb.com > > + If your life is a hard drive, Christ can be your backup. + > Index: doc/src/sgml/libpq.sgml > =================================================================== > RCS file: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v > retrieving revision 1.209 > diff -c -c -r1.209 libpq.sgml > *** doc/src/sgml/libpq.sgml 17 May 2006 21:50:54 -0000 1.209 > --- doc/src/sgml/libpq.sgml 18 May 2006 18:15:30 -0000 > *************** > *** 4115,4125 **** > system's documentation for information about how to build > thread-enabled applications, or look in > <filename>src/Makefile.global</filename> for <literal>PTHREAD_CFLAGS</> > ! and <literal>PTHREAD_LIBS</>. > </para> > > <para> > ! One restriction is that no two threads attempt to manipulate the same > <structname>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 > --- 4115,4146 ---- > system's documentation for information about how to build > thread-enabled applications, or look in > <filename>src/Makefile.global</filename> for <literal>PTHREAD_CFLAGS</> > ! and <literal>PTHREAD_LIBS</>. This function allows the querying of > ! <application>libpq</application>'s thread-safe status: > </para> > > + <variablelist> > + <varlistentry> > + > <term><function>PQisthreadsafe</function><indexterm><primary>PQisthreadsafe</></></term> > + <listitem> > <para> > ! Returns the thread safety status of the > <application>libpq</application> > ! library. > ! <synopsis> > ! int PQisthreadsafe(); > ! </synopsis> > ! </para> > ! > ! <para> > ! Returns 1 if the <application>libpq</application> is thead-safe and > ! 0 if it is not. > ! </para> > ! </listitem> > ! </varlistentry> > ! </variablelist> > ! > ! <para> > ! One thread restriction is that no two threads attempt to manipulate the same > <structname>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 > Index: src/interfaces/libpq/exports.txt > =================================================================== > RCS file: /cvsroot/pgsql/src/interfaces/libpq/exports.txt,v > retrieving revision 1.7 > diff -c -c -r1.7 exports.txt > *** src/interfaces/libpq/exports.txt 26 Dec 2005 14:58:05 -0000 1.7 > --- src/interfaces/libpq/exports.txt 18 May 2006 18:15:51 -0000 > *************** > *** 126,128 **** > --- 126,129 ---- > PQinitSSL 124 > PQregisterThreadLock 125 > PQencryptPassword 126 > + PQisthreadsafe 127 > Index: src/interfaces/libpq/fe-exec.c > =================================================================== > RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v > retrieving revision 1.182 > diff -c -c -r1.182 fe-exec.c > *** src/interfaces/libpq/fe-exec.c 14 Mar 2006 22:48:23 -0000 1.182 > --- src/interfaces/libpq/fe-exec.c 18 May 2006 18:15:53 -0000 > *************** > *** 2326,2331 **** > --- 2326,2343 ---- > 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) > Index: src/interfaces/libpq/libpq-fe.h > =================================================================== > RCS file: /cvsroot/pgsql/src/interfaces/libpq/libpq-fe.h,v > retrieving revision 1.127 > diff -c -c -r1.127 libpq-fe.h > *** src/interfaces/libpq/libpq-fe.h 27 Apr 2006 00:53:58 -0000 1.127 > --- src/interfaces/libpq/libpq-fe.h 18 May 2006 18:15:54 -0000 > *************** > *** 366,371 **** > --- 366,372 ---- > /* 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); > > ---------------------------(end of broadcast)--------------------------- > TIP 9: In versions below 8.0, the planner will ignore your desire to > choose an index scan if your joining column's datatypes do not > match -- Bruce Momjian http://candle.pha.pa.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. + ---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org