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_H
> 
> typedef 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
> +#endif
>  
>       if (!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 @@
>       [EMAIL PROTECTED] "$(OUTDIR)\$(OUTFILENAME)dll.lib"
>       [EMAIL PROTECTED] "$(INTDIR)\wchar.obj"
>       [EMAIL PROTECTED] "$(INTDIR)\encnames.obj"
> +     [EMAIL PROTECTED] "$(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 [EMAIL PROTECTED] so that your
>       message can get through to the mailing list cleanly

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/Makefile
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/Makefile,v
retrieving revision 1.109
diff -c -c -r1.109 Makefile
*** src/interfaces/libpq/Makefile       24 May 2004 01:01:38 -0000      1.109
--- src/interfaces/libpq/Makefile       19 Jun 2004 04:40:39 -0000
***************
*** 25,32 ****
--- 25,38 ----
        fe-protocol2.o fe-protocol3.o pqexpbuffer.o pqsignal.o fe-secure.o \
        dllist.o md5.o ip.o wchar.o encnames.o noblock.o pgstrcasecmp.o thread.o \
        $(filter crypt.o getaddrinfo.o inet_aton.o open.o snprintf.o strerror.o, 
$(LIBOBJS))
+ 
  ifeq ($(PORTNAME), win32)
  OBJS+=win32.o
+ ifeq ($(enable_thread_safety), yes)
+ # This doesn't work yet because configure test fails.  2004-06-19
+ OBJS+=pthread-win32.o
+ PTHREAD_H_WIN32=yes
+ endif
  endif
  
  
***************
*** 39,45 ****
  endif
  
  
! all: all-lib
  
  # Shared library stuff
  include $(top_srcdir)/src/Makefile.shlib
--- 45,51 ----
  endif
  
  
! all: $(PTHREAD_H_WIN32) all-lib
  
  # Shared library stuff
  include $(top_srcdir)/src/Makefile.shlib
***************
*** 66,71 ****
--- 72,82 ----
        rm -f $@ && $(LN_S) $< .
  
  
+ ifeq ($(PTHREAD_H_WIN32))
+ pthread.h : % : $(top_srcdir)/src/interfaces/libpq/pthread.h.win
+       rm -f $@ && $(LN_S) $< .
+ endif
+ 
  install: all installdirs install-lib
        $(INSTALL_DATA) $(srcdir)/libpq-fe.h $(DESTDIR)$(includedir)
        $(INSTALL_DATA) $(srcdir)/libpq-int.h $(DESTDIR)$(includedir_internal)
***************
*** 79,82 ****
        rm -f $(DESTDIR)$(includedir)/libpq-fe.h 
$(DESTDIR)$(includedir_internal)/libpq-int.h 
$(DESTDIR)$(includedir_internal)/pqexpbuffer.h
  
  clean distclean maintainer-clean: clean-lib
!       rm -f $(OBJS) crypt.c getaddrinfo.c inet_aton.c noblock.c pgstrcasecmp.c 
snprintf.c strerror.c open.c thread.c dllist.c md5.c ip.c encnames.c wchar.c
--- 90,93 ----
        rm -f $(DESTDIR)$(includedir)/libpq-fe.h 
$(DESTDIR)$(includedir_internal)/libpq-int.h 
$(DESTDIR)$(includedir_internal)/pqexpbuffer.h
  
  clean distclean maintainer-clean: clean-lib
!       rm -f $(OBJS) crypt.c getaddrinfo.c inet_aton.c noblock.c pgstrcasecmp.c 
snprintf.c strerror.c open.c thread.c dllist.c md5.c ip.c encnames.c wchar.c pthread.h
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to