win32 libpq ENABLE_THREAD_SAFETY
So here's the updated ENABLE_THREAD_SAFETY patch for win32, to be
compiled under VC5/6/7 (tested with VC6).
nmake -f win32.mak [DEBUG=1] [USE_SSL=1] [ENABLE_THREAD_SAFETY=1]
are supported.
Regards,
Andreas
Patch applied. Thanks. I updated the comments at the top of win32.mak
too to document this new option.
I also made some changes so our Win32 native port can use threads too.
I need to modify the configure tests but for now the attached applied
patch will set up the groundwork for it. Mingw does support threads,
right?
---------------------------------------------------------------------------
Andreas Pflug wrote:
So here's the updated ENABLE_THREAD_SAFETY patch for win32, to be
compiled under VC5/6/7 (tested with VC6).nmake -f win32.mak [DEBUG=1] [USE_SSL=1] [ENABLE_THREAD_SAFETY=1]
are supported.
Regards,
Andreas
/*-------------------------------------------------------------------------
*
* pthread-win32.c
* partial pthread implementation for win32
*
* Copyright (c) 2004, PostgreSQL Global Development Group
* IDENTIFICATION
* $PostgreSQL: $
*
*-------------------------------------------------------------------------
*/#include "windows.h"
#include "pthread.h"HANDLE pthread_self()
{
return GetCurrentThread();
}void pthread_setspecific(pthread_key_t key, void *val)
{
}void *pthread_getspecific(pthread_key_t key)
{
return NULL;
}void pthread_mutex_init(pthread_mutex_t *mp, void *attr)
{
*mp = CreateMutex(0, 0, 0);
}void pthread_mutex_lock(pthread_mutex_t *mp)
{
WaitForSingleObject(*mp, INFINITE);
}void pthread_mutex_unlock(pthread_mutex_t *mp)
{
ReleaseMutex(*mp);
}
#ifndef __PTHREAD_H
#define __PTHREAD_Htypedef ULONG pthread_key_t;
typedef HANDLE pthread_mutex_t;
typedef int pthread_once_t;HANDLE pthread_self();
void pthread_setspecific(pthread_key_t, void*);
void* pthread_getspecific(pthread_key_t);void pthread_mutex_init(pthread_mutex_t *, void *attr);
void pthread_mutex_lock(pthread_mutex_t*); // blocking
void pthread_mutex_unlock(pthread_mutex_t*);#endif
Index: interfaces/libpq/fe-connect.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v retrieving revision 1.274 diff -u -r1.274 fe-connect.c --- interfaces/libpq/fe-connect.c 10 Jun 2004 22:26:24 -0000 1.274 +++ interfaces/libpq/fe-connect.c 13 Jun 2004 19:13:58 -0000 @@ -882,11 +882,13 @@ const char *node = NULL; int ret; #ifdef ENABLE_THREAD_SAFETY +#ifndef WIN32 static pthread_once_t check_sigpipe_once = PTHREAD_ONCE_INIT;/* Check only on first connection request */
pthread_once(&check_sigpipe_once, check_sigpipe_handler);
#endif
+#endifif (!conn)
return 0;
@@ -3183,11 +3185,19 @@
}static pgthreadlock_t default_threadlock; + static void default_threadlock(int acquire) { #ifdef ENABLE_THREAD_SAFETY +#ifndef WIN32 static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER; +#else + static pthread_mutex_t singlethread_lock; + static long mutex_initialized = 0; + if (!InterlockedExchange(&mutex_initialized, 1L)) + pthread_mutex_init(&singlethread_lock, NULL); +#endif if (acquire) pthread_mutex_lock(&singlethread_lock); else Index: interfaces/libpq/fe-secure.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/libpq/fe-secure.c,v retrieving revision 1.41 diff -u -r1.41 fe-secure.c --- interfaces/libpq/fe-secure.c 3 Jun 2004 00:13:19 -0000 1.41 +++ interfaces/libpq/fe-secure.c 13 Jun 2004 19:14:00 -0000 @@ -864,8 +864,14 @@ init_ssl_system(PGconn *conn) { #ifdef ENABLE_THREAD_SAFETY -static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER; - +#ifndef WIN32 + static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER; +#else + static pthread_mutex_t init_mutex; + static long mutex_initialized = 0L; + if (!InterlockedExchange(&mutex_initialized, 1L)) + pthread_mutex_init(&init_mutex, NULL); +#endif pthread_mutex_lock(&init_mutex);if (pq_initssllib && pq_lockarray == NULL) {
@@ -1171,6 +1177,7 @@#ifdef ENABLE_THREAD_SAFETY
+#ifndef WIN32
/*
* Check SIGPIPE handler and perhaps install our own.
*/
@@ -1210,6 +1217,7 @@
if (!PQinSend())
exit(128 + SIGPIPE); /* typical return value for SIG_DFL */
}
+#endif
#endif/* Index: interfaces/libpq/win32.mak =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/libpq/win32.mak,v retrieving revision 1.24 diff -u -r1.24 win32.mak --- interfaces/libpq/win32.mak 4 Jun 2004 13:30:04 -0000 1.24 +++ interfaces/libpq/win32.mak 13 Jun 2004 19:14:01 -0000 @@ -74,21 +74,25 @@ -@erase "$(OUTDIR)\$(OUTFILENAME)dll.lib" -@erase "$(INTDIR)\wchar.obj" -@erase "$(INTDIR)\encnames.obj" + -@erase "$(INTDIR)\pthread-win32.obj"-config: ..\..\include\pg_config.h pg_config_paths.h +config: ..\..\include\pg_config.h pthread.h pg_config_paths.h..\..\include\pg_config.h: ..\..\include\pg_config.h.win32
copy ..\..\include\pg_config.h.win32 ..\..\include\pg_config.h+pthread.h: pthread.h.win32 + copy pthread.h.win32 pthread.h + pg_config_paths.h: win32.mak echo #define SYSCONFDIR "" >pg_config_paths.h"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"-CPP_PROJ=/nologo /W3 /GX $(OPT) /I "..\..\include" /D "FRONTEND" $(DEBUGDEF) /D\ +CPP_PROJ=/nologo /W3 /GX $(OPT) /I "..\..\include" /I. /D "FRONTEND" $(DEBUGDEF) /D\ "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\libpq.pch" /YX\ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c /D "HAVE_VSNPRINTF" /D "HAVE_STRDUP"@@ -127,7 +131,8 @@ "$(INTDIR)\fe-secure.obj" \ "$(INTDIR)\pqexpbuffer.obj" \ "$(INTDIR)\wchar.obj" \ - "$(INTDIR)\encnames.obj" + "$(INTDIR)\encnames.obj" \ + "$(INTDIR)\pthread-win32.obj"RSC_PROJ=/l 0x409 /fo"$(INTDIR)\libpq.res"
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073