-if test x"$template" != x"win32"
-then
echo "$as_me:$LINENO: checking for POSIX signal interface" >&5
echo $ECHO_N "checking for POSIX signal interface... $ECHO_C" >&6
if test "${pgac_cv_func_posix_signals+set}" = set; then
" >&2;}
{ (exit 1); exit 1; }; }
fi
-fi
if test $ac_cv_func_fseeko = yes; then
# Check whether --enable-largefile or --disable-largefile was given.
# defined. Cross compiling throws a warning.
#
if test "$enable_thread_safety_force" = yes; then
-if test x"$template" != x"win32"
-then
{ echo "$as_me:$LINENO: WARNING:
*** Skipping thread test program. --enable-thread-safety-force was used.
*** Run the program in src/tools/thread on the your machine and add
proper locking function calls to your applications to guarantee thread
safety.
" >&2;}
-else
-{ echo "$as_me:$LINENO: WARNING: *** Skipping thread test on Win32" >&5
-echo "$as_me: WARNING: *** Skipping thread test on Win32" >&2;}
-fi
elif test "$enable_thread_safety" = yes; then
-if test x"$template" != x"win32"
-then
echo "$as_me:$LINENO: checking thread safety of required library functions" >&5
echo $ECHO_N "checking thread safety of required library functions... $ECHO_C" >&6
fi
CFLAGS="$_CFLAGS"
LIBS="$_LIBS"
-else
-{ echo "$as_me:$LINENO: WARNING: *** Skipping thread test on Win32" >&5
-echo "$as_me: WARNING: *** Skipping thread test on Win32" >&2;}
-fi
fi
# prepare build tree if outside source tree
dnl Process this file with autoconf to produce a configure script.
-dnl $PostgreSQL: pgsql/configure.in,v 1.421 2005/08/23 20:45:04 momjian Exp $
+dnl $PostgreSQL: pgsql/configure.in,v 1.422 2005/08/23 20:48:44 momjian Exp $
dnl
dnl Developers, please strive to achieve this order:
dnl
AC_CHECK_TYPES(sig_atomic_t, [], [], [#include <signal.h>])
-if test x"$template" != x"win32"
-then
PGAC_FUNC_POSIX_SIGNALS
if test "$pgac_cv_func_posix_signals" != yes -a "$enable_thread_safety" = yes; then
AC_MSG_ERROR([
*** operating system.
])
fi
-fi
if test $ac_cv_func_fseeko = yes; then
AC_SYS_LARGEFILE
# defined. Cross compiling throws a warning.
#
if test "$enable_thread_safety_force" = yes; then
-if test x"$template" != x"win32"
-then
AC_MSG_WARN([
*** Skipping thread test program. --enable-thread-safety-force was used.
*** Run the program in src/tools/thread on the your machine and add
proper locking function calls to your applications to guarantee thread
safety.
])
-else
-AC_MSG_WARN([*** Skipping thread test on Win32])
-fi
elif test "$enable_thread_safety" = yes; then
-if test x"$template" != x"win32"
-then
AC_MSG_CHECKING([thread safety of required library functions])
_CFLAGS="$CFLAGS"
])])
CFLAGS="$_CFLAGS"
LIBS="$_LIBS"
-else
-AC_MSG_WARN([*** Skipping thread test on Win32])
-fi
fi
# prepare build tree if outside source tree
<!--
-$PostgreSQL: pgsql/doc/src/sgml/release.sgml,v 1.347 2005/08/23 20:45:05 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/release.sgml,v 1.348 2005/08/23 20:48:45 momjian Exp $
-->
<appendix id="release">
</itemizedlist>
</para>
<para>
- <function>pg_complete_relation_size()</> includes indexes and TOAST
+ <function>complete_relation_size()</> includes indexes and TOAST
tables.
</para>
</listitem>
# Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
#
-# $PostgreSQL: pgsql/src/interfaces/libpq/Makefile,v 1.135 2005/08/23 20:45:06 momjian Exp $
+# $PostgreSQL: pgsql/src/interfaces/libpq/Makefile,v 1.136 2005/08/23 20:48:46 momjian Exp $
#
#-------------------------------------------------------------------------
windres -i libpq.rc -o libpqrc.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 = pthread.h
endif
endif
endif
-all: def-files $(srcdir)/libpq.rc all-lib
+all: $(PTHREAD_H_WIN32) def-files $(srcdir)/libpq.rc all-lib
# Shared library stuff
include $(top_srcdir)/src/Makefile.shlib
$(srcdir)/libpq.rc: libpq.rc.in $(top_builddir)/src/Makefile.global
sed -e 's/\(VERSION.*\),0 *$$/\1,'`date '+%y%j' | sed 's/^0*//'`'/' < $< > $@
+ifneq ($(PTHREAD_H_WIN32), "")
+pthread.h: $(top_srcdir)/src/interfaces/libpq/pthread.h.win
+ rm -f $@ && $(LN_S) $< .
+endif
+
fe-connect.o: fe-connect.c $(top_builddir)/src/port/pg_config_paths.h
$(top_builddir)/src/port/pg_config_paths.h:
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.318 2005/08/23 20:45:06 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.319 2005/08/23 20:48:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#endif
#ifdef ENABLE_THREAD_SAFETY
-#ifdef WIN32
-#include "pthread-win32.h"
-#else
#include <pthread.h>
#endif
-#endif
#include "libpq/ip.h"
#include "mb/pg_wchar.h"
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.172 2005/08/23 20:45:07 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.173 2005/08/23 20:48:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
char *endptr = NULL;
unsigned long result;
- if (!res ||
- !res->cmdStatus ||
- strncmp(res->cmdStatus, "INSERT ", 7) != 0 ||
- res->cmdStatus[7] < '0' ||
- res->cmdStatus[7] > '9')
+ if (!res || !res->cmdStatus || strncmp(res->cmdStatus, "INSERT ", 7) != 0)
return InvalidOid;
+#ifdef WIN32
+ SetLastError(0);
+#else
+ errno = 0;
+#endif
result = strtoul(res->cmdStatus + 7, &endptr, 10);
- if (!endptr || (*endptr != ' ' && *endptr != '\0'))
+ if (!endptr || (*endptr != ' ' && *endptr != '\0')
+#ifndef WIN32
+ /*
+ * On WIN32, errno is not thread-safe and GetLastError() isn't set by
+ * strtoul(), so we can't check on this platform.
+ */
+ || errno == ERANGE
+#endif
+ )
return InvalidOid;
else
return (Oid) result;
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-misc.c,v 1.117 2005/08/23 20:45:07 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-misc.c,v 1.118 2005/08/23 20:48:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
if (!already_bound)
{
/* dgettext() preserves errno, but bindtextdomain() doesn't */
-#ifdef WIN32
- int save_errno = GetLastError();
-#else
- int save_errno = errno;
-#endif
+ int save_errno = errno;
const char *ldir;
already_bound = true;
* didn't really belong there.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-print.c,v 1.61 2005/08/23 20:45:07 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-print.c,v 1.62 2005/08/23 20:48:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
int total_line_length = 0;
int usePipe = 0;
char *pagerenv;
-#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
+#ifdef ENABLE_THREAD_SAFETY
sigset_t osigset;
bool sigpipe_masked = false;
bool sigpipe_pending;
if (fout)
{
usePipe = 1;
-#ifndef WIN32
#ifdef ENABLE_THREAD_SAFETY
if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0)
sigpipe_masked = true;
#else
+#ifndef WIN32
oldsigpipehandler = pqsignal(SIGPIPE, SIG_IGN);
-#endif /* ENABLE_THREAD_SAFETY */
-#endif /* WIN32 */
+#endif
+#endif
}
else
fout = stdout;
_pclose(fout);
#else
pclose(fout);
-
+#endif
#ifdef ENABLE_THREAD_SAFETY
/* we can't easily verify if EPIPE occurred, so say it did */
if (sigpipe_masked)
pq_reset_sigpipe(&osigset, sigpipe_pending, true);
#else
+#ifndef WIN32
pqsignal(SIGPIPE, oldsigpipehandler);
-#endif /* ENABLE_THREAD_SAFETY */
-#endif /* WIN32 */
+#endif
+#endif
}
if (po->html3 && !po->expanded)
fputs("</table>\n", fout);
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.68 2005/08/23 20:45:07 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.69 2005/08/23 20:48:47 momjian Exp $
*
* NOTES
* [ Most of these notes are wrong/obsolete, but perhaps not all ]
#include <sys/stat.h>
#ifdef ENABLE_THREAD_SAFETY
-#ifdef WIN32
-#include "pthread-win32.h"
-#else
#include <pthread.h>
#endif
-#endif
#ifndef HAVE_STRDUP
#include "strdup.h"
pqsecure_write(PGconn *conn, const void *ptr, size_t len)
{
ssize_t n;
-
-#ifndef WIN32
+
#ifdef ENABLE_THREAD_SAFETY
sigset_t osigmask;
bool sigpipe_pending;
bool got_epipe = false;
-
if (pq_block_sigpipe(&osigmask, &sigpipe_pending) < 0)
return -1;
#else
+#ifndef WIN32
pqsigfunc oldsighandler = pqsignal(SIGPIPE, SIG_IGN);
-#endif /* ENABLE_THREAD_SAFETY */
-#endif /* WIN32 */
-
+#endif
+#endif
+
#ifdef USE_SSL
if (conn->ssl)
{
if (n == -1)
{
-#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
+#ifdef ENABLE_THREAD_SAFETY
if (SOCK_ERRNO == EPIPE)
got_epipe = true;
#endif
#endif
{
n = send(conn->sock, ptr, len, 0);
-#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
+#ifdef ENABLE_THREAD_SAFETY
if (n < 0 && SOCK_ERRNO == EPIPE)
got_epipe = true;
#endif
}
-
-#ifndef WIN32
+
#ifdef ENABLE_THREAD_SAFETY
pq_reset_sigpipe(&osigmask, sigpipe_pending, got_epipe);
#else
+#ifndef WIN32
pqsignal(SIGPIPE, oldsighandler);
-#endif /* ENABLE_THREAD_SAFETY */
-#endif /* WIN32 */
+#endif
+#endif
return n;
}
#endif /* USE_SSL */
-#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
+#ifdef ENABLE_THREAD_SAFETY
/*
* Block SIGPIPE for this thread. This prevents send()/write() from exiting
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/interfaces/libpq/libpq-int.h,v 1.105 2005/08/23 20:45:07 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/libpq-int.h,v 1.106 2005/08/23 20:48:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#endif
#ifdef ENABLE_THREAD_SAFETY
-#ifdef WIN32
-#include "pthread-win32.h"
-#else
#include <pthread.h>
-#endif
#include <signal.h>
#endif
extern ssize_t pqsecure_read(PGconn *, void *ptr, size_t len);
extern ssize_t pqsecure_write(PGconn *, const void *ptr, size_t len);
-#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
+#ifdef ENABLE_THREAD_SAFETY
extern int pq_block_sigpipe(sigset_t *osigset, bool *sigpipe_pending);
extern void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending,
bool got_epipe);
*
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
* IDENTIFICATION
-* $PostgreSQL: pgsql/src/interfaces/libpq/pthread-win32.c,v 1.6 2005/08/23 20:45:07 momjian Exp $
+* $PostgreSQL: pgsql/src/interfaces/libpq/pthread-win32.c,v 1.7 2005/08/23 20:48:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include <windows.h>
-#include "pthread-win32.h"
+#include "pthread.h"
HANDLE
pthread_self()
/config/acx_pthread.m4, add PTHREAD_CFLAGS and PTHREAD_LIBS defines to
your template/${port} file.
-Windows Systems
-===============
-
-Windows systems do not vary in their thread-safeness in the same way that
-other systems might, nor do they generally have pthreads installed, hence
-on Windows this test is skipped by the configure program (pthreads is
-required by the test program, but not PostgreSQL itself). If you do wish
-to test your system however, you can do so as follows:
-
-1) Install pthreads in you Mingw/Msys environment. You can download pthreads
- from ftp://sources.redhat.com/pub/pthreads-win32/.
-
-2) Build the test program:
-
- gcc -o thread_test.exe \
- -D_REENTRANT \
- -D_THREAD_SAFE \
- -D_POSIX_PTHREAD_SEMANTICS \
- -I../../../src/include/port/win32 \
- thread_test.c \
- -lwsock32 \
- -lpthreadgc2
-
-3) Run thread_test.exe. You should see output like:
-
- dpage@PC30:/cvs/pgsql/src/tools/thread$ ./thread_test
- Your GetLastError() is thread-safe.
- Your system uses strerror() which is thread-safe.
- getpwuid_r()/getpwuid() are not applicable to Win32 platforms.
- Your system uses gethostbyname which is thread-safe.
-
- Your platform is thread-safe.
-
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/tools/thread/thread_test.c,v 1.38 2005/08/23 20:45:11 momjian Exp $
+ * $PostgreSQL: pgsql/src/tools/thread/thread_test.c,v 1.39 2005/08/23 20:48:47 momjian Exp $
*
* This program tests to see if your standard libc functions use
* pthread_setspecific()/pthread_getspecific() to be thread-safe.
*-------------------------------------------------------------------------
*/
-#if !defined(IN_CONFIGURE) && !defined(WIN32)
+#ifndef IN_CONFIGURE
#include "postgres.h"
#else
/* From src/include/c.h" */
#include <fcntl.h>
#include <errno.h>
-
-/******************************************************************
- * Windows Hacks
- *****************************************************************/
-
-#ifdef WIN32
-#define MAXHOSTNAMELEN 63
-#include <winsock2.h>
-
-int mkstemp(char *template);
-
-int
-mkstemp(char *template)
-{
- FILE *foo;
-
- mktemp(template);
- foo = fopen(template, "rw");
- if (!foo)
- return -1;
- else
- return (int)foo;
-}
-
-#endif
-
-/******************************************************************
- * End Windows Hacks
- *****************************************************************/
-
-
/* Test for POSIX.1c 2-arg sigwait() and fail on single-arg version */
#include <signal.h>
int sigwait(const sigset_t *set, int *sig);
-#if !defined(ENABLE_THREAD_SAFETY) && !defined(IN_CONFIGURE) && !(defined(WIN32))
+#if !defined(ENABLE_THREAD_SAFETY) && !defined(IN_CONFIGURE)
int
main(int argc, char *argv[])
{
static void func_call_1(void);
static void func_call_2(void);
-#ifdef WIN32
-#define TEMP_FILENAME_1 "thread_test.1.XXXXXX"
-#define TEMP_FILENAME_2 "thread_test.2.XXXXXX"
-#else
#define TEMP_FILENAME_1 "/tmp/thread_test.1.XXXXXX"
#define TEMP_FILENAME_2 "/tmp/thread_test.2.XXXXXX"
-#endif
static char *temp_filename_1;
static char *temp_filename_2;
static bool strerror_threadsafe = false;
#endif
-#ifndef WIN32
#ifndef HAVE_GETPWUID_R
static struct passwd *passwd_p1;
static struct passwd *passwd_p2;
static bool getpwuid_threadsafe = false;
#endif
-#endif
#if !defined(HAVE_GETADDRINFO) && !defined(HAVE_GETHOSTBYNAME_R)
static struct hostent *hostent_p1;
main(int argc, char *argv[])
{
pthread_t thread1,
- thread2;
- int fd;
-#ifdef WIN32
- WSADATA wsaData;
- int err;
-#endif
+ thread2;
+ int fd;
if (argc > 1)
{
dup(5);
#endif
-#ifdef WIN32
- err = WSAStartup(MAKEWORD(1, 1), &wsaData);
- if (err != 0) {
- fprintf(stderr, "Cannot start the network subsystem - %d**\nexiting\n", err);
- exit(1);
- }
-#endif
-
/* Make temp filenames, might not have strdup() */
temp_filename_1 = malloc(strlen(TEMP_FILENAME_1) + 1);
strcpy(temp_filename_1, TEMP_FILENAME_1);
while (thread1_done == 0 || thread2_done == 0)
sched_yield(); /* if this is a portability problem,
* remove it */
-#ifdef WIN32
- printf("Your GetLastError() is thread-safe.\n");
-#else
+
printf("Your errno is thread-safe.\n");
-#endif
#ifndef HAVE_STRERROR_R
if (strerror_p1 != strerror_p2)
strerror_threadsafe = true;
#endif
-#ifndef WIN32
#ifndef HAVE_GETPWUID_R
if (passwd_p1 != passwd_p2)
getpwuid_threadsafe = true;
#endif
-#endif
#if !defined(HAVE_GETADDRINFO) && !defined(HAVE_GETHOSTBYNAME_R)
if (hostent_p1 != hostent_p2)
}
#endif
-#ifndef WIN32
#ifdef HAVE_GETPWUID_R
printf("Your system has getpwuid_r(); it does not need getpwuid().\n");
#else
platform_is_threadsafe = false;
}
#endif
-#else
- printf("getpwuid_r()/getpwuid() are not applicable to Win32 platforms.\n");
-#endif
#ifdef HAVE_GETADDRINFO
printf("Your system has getaddrinfo(); it does not need gethostbyname()\n"
!defined(HAVE_GETHOSTBYNAME_R))
void *p;
#endif
-#ifdef WIN32
- HANDLE h1;
- HANDLE h2;
-#endif
+
unlink(temp_filename_1);
-
-
/* create, then try to fail on exclusive create open */
-#ifdef WIN32
- h1 = CreateFile(temp_filename_1, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL);
- h2 = CreateFile(temp_filename_1, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
- if (h1 == INVALID_HANDLE_VALUE || GetLastError() != ERROR_FILE_EXISTS)
-#else
if (open(temp_filename_1, O_RDWR | O_CREAT, 0600) < 0 ||
open(temp_filename_1, O_RDWR | O_CREAT | O_EXCL, 0600) >= 0)
-#endif
{
-#ifdef WIN32
- fprintf(stderr, "Could not create file in current directory or\n");
- fprintf(stderr, "Could not generate failure for create file in current directory **\nexiting\n");
-#else
fprintf(stderr, "Could not create file in /tmp or\n");
fprintf(stderr, "Could not generate failure for create file in /tmp **\nexiting\n");
-#endif
exit(1);
}
errno1_set = 1;
while (errno2_set == 0)
sched_yield();
-#ifdef WIN32
- if (GetLastError() != ERROR_FILE_EXISTS)
-#else
- if (errno != EEXIST)
-#endif
+ if (errno != EEXIST)
{
-#ifdef WIN32
- fprintf(stderr, "GetLastError() not thread-safe **\nexiting\n");
-#else
- fprintf(stderr, "errno not thread-safe **\nexiting\n");
-#endif
+ fprintf(stderr, "errno not thread-safe **\nexiting\n");
unlink(temp_filename_1);
exit(1);
}
*/
#endif
-#ifndef WIN32
#ifndef HAVE_GETPWUID_R
passwd_p1 = getpwuid(0);
p = getpwuid(1);
passwd_p1 = NULL; /* force thread-safe failure report */
}
#endif
-#endif
#if !defined(HAVE_GETADDRINFO) && !defined(HAVE_GETHOSTBYNAME_R)
/* threads do this in opposite order */
unlink(temp_filename_2);
/* open non-existant file */
-#ifdef WIN32
- CreateFile(temp_filename_2, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
- if (GetLastError() != ERROR_FILE_NOT_FOUND)
-#else
if (open(temp_filename_2, O_RDONLY, 0600) >= 0)
-#endif
{
fprintf(stderr, "Read-only open succeeded without create **\nexiting\n");
exit(1);
errno2_set = 1;
while (errno1_set == 0)
sched_yield();
-#ifdef WIN32
- if (GetLastError() != ENOENT)
-#else
- if (errno != ENOENT)
-#endif
+ if (errno != ENOENT)
{
-#ifdef WIN32
- fprintf(stderr, "GetLastError() not thread-safe **\nexiting\n");
-#else
- fprintf(stderr, "errno not thread-safe **\nexiting\n");
-#endif
+ fprintf(stderr, "errno not thread-safe **\nexiting\n");
unlink(temp_filename_2);
exit(1);
}
*/
#endif
-#ifndef WIN32
#ifndef HAVE_GETPWUID_R
passwd_p2 = getpwuid(2);
p = getpwuid(3);
passwd_p2 = NULL; /* force thread-safe failure report */
}
#endif
-#endif
#if !defined(HAVE_GETADDRINFO) && !defined(HAVE_GETHOSTBYNAME_R)
/* threads do this in opposite order */