Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit af70d57

Browse files
committed
Enable thread safety for win32.mak build of PostgreSQL.
Andreas Pflug
1 parent 1181ea6 commit af70d57

File tree

5 files changed

+92
-8
lines changed

5 files changed

+92
-8
lines changed

src/interfaces/libpq/fe-connect.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.274 2004/06/10 22:26:24 momjian Exp $
11+
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.275 2004/06/19 04:22:17 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -882,10 +882,12 @@ connectDBStart(PGconn *conn)
882882
const char *node = NULL;
883883
int ret;
884884
#ifdef ENABLE_THREAD_SAFETY
885+
#ifndef WIN32
885886
static pthread_once_t check_sigpipe_once = PTHREAD_ONCE_INIT;
886887

887888
/* Check only on first connection request */
888889
pthread_once(&check_sigpipe_once, check_sigpipe_handler);
890+
#endif
889891
#endif
890892

891893
if (!conn)
@@ -3183,11 +3185,19 @@ PQinitSSL(int do_init)
31833185
}
31843186

31853187
static pgthreadlock_t default_threadlock;
3188+
31863189
static void
31873190
default_threadlock(int acquire)
31883191
{
31893192
#ifdef ENABLE_THREAD_SAFETY
3193+
#ifndef WIN32
31903194
static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER;
3195+
#else
3196+
static pthread_mutex_t singlethread_lock;
3197+
static long mutex_initialized = 0;
3198+
if (!InterlockedExchange(&mutex_initialized, 1L))
3199+
pthread_mutex_init(&singlethread_lock, NULL);
3200+
#endif
31913201
if (acquire)
31923202
pthread_mutex_lock(&singlethread_lock);
31933203
else

src/interfaces/libpq/fe-secure.c

+11-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.41 2004/06/03 00:13:19 momjian Exp $
14+
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.42 2004/06/19 04:22:17 momjian Exp $
1515
*
1616
* NOTES
1717
* The client *requires* a valid server certificate. Since
@@ -864,8 +864,14 @@ static int
864864
init_ssl_system(PGconn *conn)
865865
{
866866
#ifdef ENABLE_THREAD_SAFETY
867-
static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
868-
867+
#ifndef WIN32
868+
static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
869+
#else
870+
static pthread_mutex_t init_mutex;
871+
static long mutex_initialized = 0L;
872+
if (!InterlockedExchange(&mutex_initialized, 1L))
873+
pthread_mutex_init(&init_mutex, NULL);
874+
#endif
869875
pthread_mutex_lock(&init_mutex);
870876

871877
if (pq_initssllib && pq_lockarray == NULL) {
@@ -1171,6 +1177,7 @@ PQgetssl(PGconn *conn)
11711177

11721178

11731179
#ifdef ENABLE_THREAD_SAFETY
1180+
#ifndef WIN32
11741181
/*
11751182
* Check SIGPIPE handler and perhaps install our own.
11761183
*/
@@ -1211,6 +1218,7 @@ sigpipe_handler_ignore_send(int signo)
12111218
exit(128 + SIGPIPE); /* typical return value for SIG_DFL */
12121219
}
12131220
#endif
1221+
#endif
12141222

12151223
/*
12161224
* Indicates whether the current thread is in send()

src/interfaces/libpq/pthread-win32.c

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* pthread-win32.c
4+
* partial pthread implementation for win32
5+
*
6+
* Copyright (c) 2004, PostgreSQL Global Development Group
7+
* IDENTIFICATION
8+
* $PostgreSQL: pgsql/src/interfaces/libpq/pthread-win32.c,v 1.1 2004/06/19 04:22:17 momjian Exp $
9+
*
10+
*-------------------------------------------------------------------------
11+
*/
12+
13+
14+
#include "windows.h"
15+
#include "pthread.h"
16+
17+
HANDLE pthread_self()
18+
{
19+
return GetCurrentThread();
20+
}
21+
22+
void pthread_setspecific(pthread_key_t key, void *val)
23+
{
24+
}
25+
26+
void *pthread_getspecific(pthread_key_t key)
27+
{
28+
return NULL;
29+
}
30+
31+
void pthread_mutex_init(pthread_mutex_t *mp, void *attr)
32+
{
33+
*mp = CreateMutex(0, 0, 0);
34+
}
35+
36+
void pthread_mutex_lock(pthread_mutex_t *mp)
37+
{
38+
WaitForSingleObject(*mp, INFINITE);
39+
}
40+
41+
void pthread_mutex_unlock(pthread_mutex_t *mp)
42+
{
43+
ReleaseMutex(*mp);
44+
}

src/interfaces/libpq/pthread.h.win32

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef __PTHREAD_H
2+
#define __PTHREAD_H
3+
4+
typedef ULONG pthread_key_t;
5+
typedef HANDLE pthread_mutex_t;
6+
typedef int pthread_once_t;
7+
8+
HANDLE pthread_self();
9+
10+
void pthread_setspecific(pthread_key_t, void*);
11+
void* pthread_getspecific(pthread_key_t);
12+
13+
void pthread_mutex_init(pthread_mutex_t *, void *attr);
14+
void pthread_mutex_lock(pthread_mutex_t*); // blocking
15+
void pthread_mutex_unlock(pthread_mutex_t*);
16+
17+
#endif

src/interfaces/libpq/win32.mak

+9-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# and a Win32 dynamic library libpq(d).dll with import library libpq(d)dll.lib
55
# USE_SSL=1 will compile with OpenSSL
66
# DEBUG=1 compiles with debugging symbols
7-
7+
# ENABLE_THREAD_SAFETY=1 compiles with threading enabled
88

99
!MESSAGE Building the Win32 static library...
1010
!MESSAGE
@@ -74,21 +74,25 @@ CLEAN :
7474
-@erase "$(OUTDIR)\$(OUTFILENAME)dll.lib"
7575
-@erase "$(INTDIR)\wchar.obj"
7676
-@erase "$(INTDIR)\encnames.obj"
77+
-@erase "$(INTDIR)\pthread-win32.obj"
7778

7879

7980

80-
config: ..\..\include\pg_config.h pg_config_paths.h
81+
config: ..\..\include\pg_config.h pthread.h pg_config_paths.h
8182

8283
..\..\include\pg_config.h: ..\..\include\pg_config.h.win32
8384
copy ..\..\include\pg_config.h.win32 ..\..\include\pg_config.h
8485

86+
pthread.h: pthread.h.win32
87+
copy pthread.h.win32 pthread.h
88+
8589
pg_config_paths.h: win32.mak
8690
echo #define SYSCONFDIR "" >pg_config_paths.h
8791

8892
"$(OUTDIR)" :
8993
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
9094

91-
CPP_PROJ=/nologo /W3 /GX $(OPT) /I "..\..\include" /D "FRONTEND" $(DEBUGDEF) /D\
95+
CPP_PROJ=/nologo /W3 /GX $(OPT) /I "..\..\include" /I. /D "FRONTEND" $(DEBUGDEF) /D\
9296
"WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\libpq.pch" /YX\
9397
/Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c /D "HAVE_VSNPRINTF" /D "HAVE_STRDUP"
9498

@@ -127,7 +131,8 @@ LIB32_OBJS= \
127131
"$(INTDIR)\fe-secure.obj" \
128132
"$(INTDIR)\pqexpbuffer.obj" \
129133
"$(INTDIR)\wchar.obj" \
130-
"$(INTDIR)\encnames.obj"
134+
"$(INTDIR)\encnames.obj" \
135+
"$(INTDIR)\pthread-win32.obj"
131136

132137

133138
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\libpq.res"

0 commit comments

Comments
 (0)