Index: configure =================================================================== RCS file: /cvsroot/pgsql-server/configure,v retrieving revision 1.327 diff -c -c -r1.327 configure *** configure 11 Feb 2004 17:29:00 -0000 1.327 --- configure 11 Feb 2004 21:41:00 -0000 *************** *** 13198,13205 **** if test $ac_cv_header_pthread_h = yes; then : else ! { { echo "$as_me:$LINENO: error: pthread.h not found, required for --enable-thread-safetys" >&5 ! echo "$as_me: error: pthread.h not found, required for --enable-thread-safetys" >&2;} { (exit 1); exit 1; }; } fi --- 13198,13205 ---- if test $ac_cv_header_pthread_h = yes; then : else ! { { echo "$as_me:$LINENO: error: pthread.h not found, required for --enable-thread-safety" >&5 ! echo "$as_me: error: pthread.h not found, required for --enable-thread-safety" >&2;} { (exit 1); exit 1; }; } fi *************** *** 13222,13253 **** " >&2;} { (exit 1); exit 1; }; } fi - else - # do not use values from template file - THREAD_CPPFLAGS= - THREAD_LIBS= - fi - - - - # # Check for re-entrant versions of certain functions # # Include special flags if threads are enabled _and_ if required for # threading on this platform. Some platforms have *_r functions but ! # their natively named funcs are threadsafe, and should be used instead. # ! # One trick here is that if we don't call AC_CHECK_FUNCS, the # functions are marked "not found", which is perfect. # ! if test "$enable_thread_safety" = yes -a "$NEED_REENTRANT_FUNCS" = yes ; then cat >>confdefs.h <<\_ACEOF ! #define NEED_REENTRANT_FUNCS 1 _ACEOF _CFLAGS="$CFLAGS" _LIBS="$LIBS" CFLAGS="$CFLAGS $THREAD_CPPFLAGS" --- 13222,13261 ---- " >&2;} { (exit 1); exit 1; }; } fi # # Check for re-entrant versions of certain functions # # Include special flags if threads are enabled _and_ if required for # threading on this platform. Some platforms have *_r functions but ! # their natively named funcs are thread-safe too. # ! # One trick here is that if we don't call AC_CHECK_FUNCS; the # functions are marked "not found", which is perfect. # ! if test "$enable_thread_safety" = yes -a "$STRERROR_THREADSAFE" = yes ; then ! ! cat >>confdefs.h <<\_ACEOF ! #define STRERROR_THREADSAFE 1 ! _ACEOF ! ! fi ! if test "$enable_thread_safety" = yes -a "$GETPWUID_THREADSAFE" = yes ; then ! ! cat >>confdefs.h <<\_ACEOF ! #define GETPWUID_THREADSAFE 1 ! _ACEOF ! ! fi ! if test "$enable_thread_safety" = yes -a "$GETHOSTBYNAME_THREADSAFE" = yes ; then cat >>confdefs.h <<\_ACEOF ! #define GETHOSTBYNAME_THREADSAFE 1 _ACEOF + fi + + # Check for *_r functions _CFLAGS="$CFLAGS" _LIBS="$LIBS" CFLAGS="$CFLAGS $THREAD_CPPFLAGS" *************** *** 13332,13338 **** --- 13340,13355 ---- CFLAGS="$_CFLAGS" LIBS="$_LIBS" + + else + # do not use values from template file + THREAD_CPPFLAGS= + THREAD_LIBS= fi + + + + # This test makes sure that run tests work at all. Sometimes a shared Index: configure.in =================================================================== RCS file: /cvsroot/pgsql-server/configure.in,v retrieving revision 1.315 diff -c -c -r1.315 configure.in *** configure.in 11 Feb 2004 17:29:01 -0000 1.315 --- configure.in 11 Feb 2004 21:41:01 -0000 *************** *** 971,977 **** # See the comment at the top of src/port/thread.c for more information. # if test "$enable_thread_safety" = yes; then ! AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([pthread.h not found, required for --enable-thread-safetys])]) if test "$THREAD_SUPPORT" != yes; then AC_MSG_ERROR([ --- 971,977 ---- # See the comment at the top of src/port/thread.c for more information. # if test "$enable_thread_safety" = yes; then ! AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([pthread.h not found, required for --enable-thread-safety])]) if test "$THREAD_SUPPORT" != yes; then AC_MSG_ERROR([ *************** *** 982,1009 **** See the comment at the top of src/port/thread.c for more information. ]) fi - else - # do not use values from template file - THREAD_CPPFLAGS= - THREAD_LIBS= - fi - AC_SUBST(THREAD_SUPPORT) - AC_SUBST(THREAD_CPPFLAGS) - AC_SUBST(THREAD_LIBS) - # # Check for re-entrant versions of certain functions # # Include special flags if threads are enabled _and_ if required for # threading on this platform. Some platforms have *_r functions but ! # their natively named funcs are threadsafe, and should be used instead. # ! # One trick here is that if we don't call AC_CHECK_FUNCS, the # functions are marked "not found", which is perfect. # ! if test "$enable_thread_safety" = yes -a "$NEED_REENTRANT_FUNCS" = yes ; then ! AC_DEFINE(NEED_REENTRANT_FUNCS, 1, [Define if non *_r libc functions are not thread safe]) _CFLAGS="$CFLAGS" _LIBS="$LIBS" CFLAGS="$CFLAGS $THREAD_CPPFLAGS" --- 982,1009 ---- See the comment at the top of src/port/thread.c for more information. ]) fi # # Check for re-entrant versions of certain functions # # Include special flags if threads are enabled _and_ if required for # threading on this platform. Some platforms have *_r functions but ! # their natively named funcs are thread-safe too. # ! # One trick here is that if we don't call AC_CHECK_FUNCS; the # functions are marked "not found", which is perfect. # ! if test "$enable_thread_safety" = yes -a "$STRERROR_THREADSAFE" = yes ; then ! AC_DEFINE(STRERROR_THREADSAFE, 1, [Define if strerror is not thread safe]) ! fi ! if test "$enable_thread_safety" = yes -a "$GETPWUID_THREADSAFE" = yes ; then ! AC_DEFINE(GETPWUID_THREADSAFE, 1, [Define if getpwuid is not thread safe]) ! fi ! if test "$enable_thread_safety" = yes -a "$GETHOSTBYNAME_THREADSAFE" = yes ; then ! AC_DEFINE(GETHOSTBYNAME_THREADSAFE, 1, [Define if gethostbyname is not thread safe]) ! fi ! ! # Check for *_r functions _CFLAGS="$CFLAGS" _LIBS="$LIBS" CFLAGS="$CFLAGS $THREAD_CPPFLAGS" *************** *** 1011,1017 **** --- 1011,1026 ---- AC_CHECK_FUNCS([strerror_r getpwuid_r gethostbyname_r]) CFLAGS="$_CFLAGS" LIBS="$_LIBS" + + else + # do not use values from template file + THREAD_CPPFLAGS= + THREAD_LIBS= fi + + AC_SUBST(THREAD_SUPPORT) + AC_SUBST(THREAD_CPPFLAGS) + AC_SUBST(THREAD_LIBS) # This test makes sure that run tests work at all. Sometimes a shared Index: src/include/pg_config.h.in =================================================================== RCS file: /cvsroot/pgsql-server/src/include/pg_config.h.in,v retrieving revision 1.67 diff -c -c -r1.67 pg_config.h.in *** src/include/pg_config.h.in 11 Feb 2004 17:29:01 -0000 1.67 --- src/include/pg_config.h.in 11 Feb 2004 21:41:03 -0000 *************** *** 43,48 **** --- 43,54 ---- (--enable-thread-safety) */ #undef ENABLE_THREAD_SAFETY + /* Define if gethostbyname is not thread safe */ + #undef GETHOSTBYNAME_THREADSAFE + + /* Define if getpwuid is not thread safe */ + #undef GETPWUID_THREADSAFE + /* Define to 1 if gettimeofday() takes only 1 argument. */ #undef GETTIMEOFDAY_1ARG *************** *** 554,562 **** /* Define as the maximum alignment requirement of any C data type. */ #undef MAXIMUM_ALIGNOF - /* Define if non *_r libc functions are not thread safe */ - #undef NEED_REENTRANT_FUNCS - /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT --- 560,565 ---- *************** *** 587,592 **** --- 590,598 ---- /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS + + /* Define if strerror is not thread safe */ + #undef STRERROR_THREADSAFE /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME Index: src/port/thread.c =================================================================== RCS file: /cvsroot/pgsql-server/src/port/thread.c,v retrieving revision 1.14 diff -c -c -r1.14 thread.c *** src/port/thread.c 29 Nov 2003 22:41:31 -0000 1.14 --- src/port/thread.c 11 Feb 2004 21:41:04 -0000 *************** *** 31,37 **** * strerror(). Other operating systems use pthread_setspecific() * and pthread_getspecific() internally to allow standard library * functions to return static data to threaded applications. And some ! * operating systems have neither, meaning we have to do our own locking. * * Additional confusion exists because many operating systems that * use pthread_setspecific/pthread_getspecific() also have *_r versions --- 31,37 ---- * strerror(). Other operating systems use pthread_setspecific() * and pthread_getspecific() internally to allow standard library * functions to return static data to threaded applications. And some ! * operating systems have neither. * * Additional confusion exists because many operating systems that * use pthread_setspecific/pthread_getspecific() also have *_r versions *************** *** 50,67 **** * * The current setup is to try threading in this order: * ! * use non-*_r function names if they are all thread-safe ! * (NEED_REENTRANT_FUNCS=no) ! * use *_r functions if they exist (configure test) ! * do our own locking and copying of non-threadsafe functions ! * ! * The disadvantage of the last option is not the thread overhead but ! * the fact that all function calls are serialized, and with gethostbyname() ! * requiring a DNS lookup, that could be slow. * * One thread-safe solution for gethostbyname() might be to use getaddrinfo(). * ! * See src/tools/thread to see if your operating system has thread-safe * non-*_r functions. */ --- 50,62 ---- * * The current setup is to try threading in this order: * ! * use *_r function names if they exit ! * (*_THREADSAFE=ye) ! * use non-*_r functions if they are thread-safe * * One thread-safe solution for gethostbyname() might be to use getaddrinfo(). * ! * Run src/tools/thread to see if your operating system has thread-safe * non-*_r functions. */ *************** *** 73,79 **** char * pqStrerror(int errnum, char *strerrbuf, size_t buflen) { ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && defined(HAVE_STRERROR_R) /* reentrant strerror_r is available */ /* some early standards had strerror_r returning char * */ strerror_r(errnum, strerrbuf, buflen); --- 68,74 ---- char * pqStrerror(int errnum, char *strerrbuf, size_t buflen) { ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_STRERROR_R) /* reentrant strerror_r is available */ /* some early standards had strerror_r returning char * */ strerror_r(errnum, strerrbuf, buflen); *************** *** 81,98 **** #else ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_STRERROR_R) ! static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER; ! pthread_mutex_lock(&strerror_lock); #endif /* no strerror_r() available, just use strerror */ StrNCpy(strerrbuf, strerror(errnum), buflen); - #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_STRERROR_R) - pthread_mutex_unlock(&strerror_lock); - #endif - return strerrbuf; #endif } --- 76,88 ---- #else ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && !defined(STRERROR_THREADSAFE) ! #error This platform can not create a thread-safe version because strerror is not thread-safe and there is no reentrant version #endif /* no strerror_r() available, just use strerror */ StrNCpy(strerrbuf, strerror(errnum), buflen); return strerrbuf; #endif } *************** *** 106,112 **** pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) { ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && defined(HAVE_GETPWUID_R) /* * Early POSIX draft of getpwuid_r() returns 'struct passwd *'. * getpwuid_r(uid, resultbuf, buffer, buflen) --- 96,102 ---- pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) { ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_GETPWUID_R) /* * Early POSIX draft of getpwuid_r() returns 'struct passwd *'. * getpwuid_r(uid, resultbuf, buffer, buflen) *************** *** 117,169 **** #else ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_GETPWUID_R) ! static pthread_mutex_t getpwuid_lock = PTHREAD_MUTEX_INITIALIZER; ! pthread_mutex_lock(&getpwuid_lock); #endif /* no getpwuid_r() available, just use getpwuid() */ *result = getpwuid(uid); - - #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_GETPWUID_R) - - /* Use 'buffer' memory for storage of strings used by struct passwd */ - if (*result && - strlen((*result)->pw_name) + 1 + - strlen((*result)->pw_passwd) + 1 + - strlen((*result)->pw_gecos) + 1 + - /* skip class if it exists */ - strlen((*result)->pw_dir) + 1 + - strlen((*result)->pw_shell) + 1 <= buflen) - { - memcpy(resultbuf, *result, sizeof(struct passwd)); - strcpy(buffer, (*result)->pw_name); - resultbuf->pw_name = buffer; - buffer += strlen(resultbuf->pw_name) + 1; - strcpy(buffer, (*result)->pw_passwd); - resultbuf->pw_passwd = buffer; - buffer += strlen(resultbuf->pw_passwd) + 1; - strcpy(buffer, (*result)->pw_gecos); - resultbuf->pw_gecos = buffer; - buffer += strlen(resultbuf->pw_gecos) + 1; - strcpy(buffer, (*result)->pw_dir); - resultbuf->pw_dir = buffer; - buffer += strlen(resultbuf->pw_dir) + 1; - strcpy(buffer, (*result)->pw_shell); - resultbuf->pw_shell = buffer; - buffer += strlen(resultbuf->pw_shell) + 1; - - *result = resultbuf; - } - else - { - *result = NULL; - errno = ERANGE; - } - - pthread_mutex_unlock(&getpwuid_lock); - #endif #endif return (*result == NULL) ? -1 : 0; } #endif --- 107,120 ---- #else ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && !defined(GETPWUID_THREADSAFE) ! #error This platform can not create a thread-safe version because getpwuid is not thread-safe and there is no reentrant version #endif /* no getpwuid_r() available, just use getpwuid() */ *result = getpwuid(uid); #endif + return (*result == NULL) ? -1 : 0; } #endif *************** *** 181,187 **** struct hostent **result, int *herrno) { ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && defined(HAVE_GETHOSTBYNAME_R) /* * broken (well early POSIX draft) gethostbyname_r() which returns * 'struct hostent *' --- 132,138 ---- struct hostent **result, int *herrno) { ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_GETHOSTBYNAME_R) /* * broken (well early POSIX draft) gethostbyname_r() which returns * 'struct hostent *' *************** *** 191,277 **** #else ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_GETHOSTBYNAME_R) ! static pthread_mutex_t gethostbyname_lock = PTHREAD_MUTEX_INITIALIZER; ! pthread_mutex_lock(&gethostbyname_lock); #endif /* no gethostbyname_r(), just use gethostbyname() */ *result = gethostbyname(name); - #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_GETHOSTBYNAME_R) - - /* - * Use 'buffer' memory for storage of structures used by struct hostent. - * The layout is: - * - * addr pointers - * alias pointers - * addr structures - * alias structures - * name - */ - if (*result) - { - int i, pointers = 2 /* for nulls */, len = 0; - char **pbuffer; - - for (i = 0; (*result)->h_addr_list[i]; i++, pointers++) - len += (*result)->h_length; - for (i = 0; (*result)->h_aliases[i]; i++, pointers++) - len += (*result)->h_length; - - if (pointers * sizeof(char *) + MAXALIGN(len) + strlen((*result)->h_name) + 1 <= buflen) - { - memcpy(resultbuf, *result, sizeof(struct hostent)); - - pbuffer = (char **)buffer; - resultbuf->h_addr_list = pbuffer; - buffer += pointers * sizeof(char *); - - for (i = 0; (*result)->h_addr_list[i]; i++, pbuffer++) - { - memcpy(buffer, (*result)->h_addr_list[i], (*result)->h_length); - resultbuf->h_addr_list[i] = buffer; - buffer += (*result)->h_length; - } - resultbuf->h_addr_list[i] = NULL; - pbuffer++; - - resultbuf->h_aliases = pbuffer; - - for (i = 0; (*result)->h_aliases[i]; i++, pbuffer++) - { - memcpy(buffer, (*result)->h_aliases[i], (*result)->h_length); - resultbuf->h_aliases[i] = buffer; - buffer += (*result)->h_length; - } - resultbuf->h_aliases[i] = NULL; - pbuffer++; - - /* Place at end for cleaner alignment */ - buffer = MAXALIGN(buffer); - strcpy(buffer, (*result)->h_name); - resultbuf->h_name = buffer; - buffer += strlen(resultbuf->h_name) + 1; - - *result = resultbuf; - } - else - { - *result = NULL; - errno = ERANGE; - } - } - #endif - if (*result != NULL) *herrno = h_errno; - #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(NEED_REENTRANT_FUNCS) && !defined(HAVE_GETHOSTBYNAME_R) - pthread_mutex_unlock(&gethostbyname_lock); - #endif - if (*result != NULL) return 0; else --- 142,157 ---- #else ! #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && !defined(GETHOSTBYNAME_THREADSAFE) ! #error This platform can not create a thread-safe version because getaddrinfo is not thread-safe and there is no reentrant version #endif /* no gethostbyname_r(), just use gethostbyname() */ *result = gethostbyname(name); if (*result != NULL) *herrno = h_errno; if (*result != NULL) return 0; else Index: src/template/bsdi =================================================================== RCS file: /cvsroot/pgsql-server/src/template/bsdi,v retrieving revision 1.21 diff -c -c -r1.21 bsdi *** src/template/bsdi 25 Oct 2003 15:32:11 -0000 1.21 --- src/template/bsdi 11 Feb 2004 21:41:04 -0000 *************** *** 3,6 **** esac THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=no # verified 4.3 2003-09-26 --- 3,9 ---- esac THREAD_SUPPORT=yes ! # verified 4.3.1 2004-02-11 ! STRERROR_THREADSAFE=yes ! GETPWUID_THREADSAFE=yes ! GETHOSTBYNAME_THREADSAFE=yes Index: src/template/freebsd =================================================================== RCS file: /cvsroot/pgsql-server/src/template/freebsd,v retrieving revision 1.28 diff -c -c -r1.28 freebsd *** src/template/freebsd 25 Oct 2003 15:32:11 -0000 1.28 --- src/template/freebsd 11 Feb 2004 21:41:04 -0000 *************** *** 2,9 **** alpha*) CFLAGS="-O";; # alpha has problems with -O2 esac ! THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=yes THREAD_CPPFLAGS="-D_THREAD_SAFE" case $host_os in freebsd2*|freebsd3*|freebsd4*) THREAD_LIBS="-pthread";; --- 2,8 ---- alpha*) CFLAGS="-O";; # alpha has problems with -O2 esac ! # tools/thread/thread_test must be run THREAD_CPPFLAGS="-D_THREAD_SAFE" case $host_os in freebsd2*|freebsd3*|freebsd4*) THREAD_LIBS="-pthread";; Index: src/template/linux =================================================================== RCS file: /cvsroot/pgsql-server/src/template/linux,v retrieving revision 1.21 diff -c -c -r1.21 linux *** src/template/linux 9 Oct 2003 16:52:45 -0000 1.21 --- src/template/linux 11 Feb 2004 21:41:04 -0000 *************** *** 1,7 **** # Force _GNU_SOURCE on; plperl is broken with Perl 5.8.0 otherwise CPPFLAGS="-D_GNU_SOURCE" ! THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=yes # Debian kernel 2.2 2003-09-27 THREAD_CPPFLAGS="-D_REENTRANT -D_THREAD_SAFE -D_POSIX_PTHREAD_SEMANTICS" THREAD_LIBS="-lpthread" --- 1,6 ---- # Force _GNU_SOURCE on; plperl is broken with Perl 5.8.0 otherwise CPPFLAGS="-D_GNU_SOURCE" ! # tools/thread/thread_test must be run THREAD_CPPFLAGS="-D_REENTRANT -D_THREAD_SAFE -D_POSIX_PTHREAD_SEMANTICS" THREAD_LIBS="-lpthread" Index: src/template/netbsd =================================================================== RCS file: /cvsroot/pgsql-server/src/template/netbsd,v retrieving revision 1.16 diff -c -c -r1.16 netbsd *** src/template/netbsd 9 Oct 2003 22:55:46 -0000 1.16 --- src/template/netbsd 11 Feb 2004 21:41:04 -0000 *************** *** 1,2 **** ! THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=yes # 1.6 2003-09-14 --- 1 ---- ! # tools/thread/thread_test must be run Index: src/template/osf =================================================================== RCS file: /cvsroot/pgsql-server/src/template/osf,v retrieving revision 1.15 diff -c -c -r1.15 osf *** src/template/osf 8 Jan 2004 15:51:24 -0000 1.15 --- src/template/osf 11 Feb 2004 21:41:04 -0000 *************** *** 3,10 **** CFLAGS="-O -ieee" fi ! THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=no # 4.0 2003-09-13 if test "$GCC" = yes then THREAD_LIBS="-pthread" else THREAD_CPPFLAGS="-pthread" --- 3,9 ---- CFLAGS="-O -ieee" fi ! # tools/thread/thread_test must be run if test "$GCC" = yes then THREAD_LIBS="-pthread" else THREAD_CPPFLAGS="-pthread" Index: src/template/solaris =================================================================== RCS file: /cvsroot/pgsql-server/src/template/solaris,v retrieving revision 1.12 diff -c -c -r1.12 solaris *** src/template/solaris 8 Jan 2004 04:24:24 -0000 1.12 --- src/template/solaris 11 Feb 2004 21:41:04 -0000 *************** *** 9,16 **** i?86-*-solaris*) need_tas=yes; tas_file=solaris_i386.s ;; esac ! THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=yes # 5.6 2003-09-13 if test "$GCC" = yes then THREAD_LIBS="-pthread" else THREAD_CPPFLAGS="-mt" --- 9,15 ---- i?86-*-solaris*) need_tas=yes; tas_file=solaris_i386.s ;; esac ! # tools/thread/thread_test must be run if test "$GCC" = yes then THREAD_LIBS="-pthread" else THREAD_CPPFLAGS="-mt" Index: src/template/unixware =================================================================== RCS file: /cvsroot/pgsql-server/src/template/unixware,v retrieving revision 1.29 diff -c -c -r1.29 unixware *** src/template/unixware 5 Nov 2003 07:42:31 -0000 1.29 --- src/template/unixware 11 Feb 2004 21:41:04 -0000 *************** *** 24,29 **** THREAD_CPPFLAGS="-K pthread" fi ! THREAD_SUPPORT=yes ! NEED_REENTRANT_FUNCS=no # verified 7.1.3 2003-09-03 THREAD_CPPFLAGS="$THREAD_CPPFLAGS -D_REENTRANT" --- 24,28 ---- THREAD_CPPFLAGS="-K pthread" fi ! # tools/thread/thread_test must be run THREAD_CPPFLAGS="$THREAD_CPPFLAGS -D_REENTRANT" Index: src/tools/thread/thread_test.c =================================================================== RCS file: /cvsroot/pgsql-server/src/tools/thread/thread_test.c,v retrieving revision 1.6 diff -c -c -r1.6 thread_test.c *** src/tools/thread/thread_test.c 19 Dec 2003 23:29:15 -0000 1.6 --- src/tools/thread/thread_test.c 11 Feb 2004 21:41:05 -0000 *************** *** 33,48 **** void func_call_1(void); void func_call_2(void); ! #ifndef HAVE_GETADDRINFO ! struct hostent *hostent_p1; ! struct hostent *hostent_p2; ! #endif struct passwd *passwd_p1; struct passwd *passwd_p2; ! char *strerror_p1; ! char *strerror_p2; int main(int argc, char *argv[]) { --- 33,46 ---- void func_call_1(void); void func_call_2(void); ! char *strerror_p1; ! char *strerror_p2; struct passwd *passwd_p1; struct passwd *passwd_p2; ! struct hostent *hostent_p1; ! struct hostent *hostent_p2; int main(int argc, char *argv[]) { *************** *** 64,111 **** pthread_join(thread1, NULL); pthread_join(thread2, NULL); ! #ifndef HAVE_GETADDRINFO ! if (hostent_p1 == hostent_p2) ! printf("Your gethostbyname() is _not_ thread-safe\n"); ! #endif ! if (passwd_p1 == passwd_p2) ! printf("Your getpwuid() is _not_ thread-safe\n"); ! if (strerror_p1 == strerror_p2) ! printf("Your strerror() is _not_ thread-safe\n"); ! ! if ( ! #ifndef HAVE_GETADDRINFO ! hostent_p1 != hostent_p2 && ! #endif ! passwd_p1 != passwd_p2 && ! strerror_p1 != strerror_p2) ! { ! printf("All your non-*_r functions are thread-safe.\n"); ! printf("Add this to your template/$port file:\n\n"); ! printf("NEED_REENTRANT_FUNCS=no\n"); ! } else ! { ! printf("Not all non-*_r functions are thread-safe.\n"); ! printf("Add this to your template/$port file:\n\n"); ! printf("NEED_REENTRANT_FUNCS=yes\n"); ! } return 0; } void func_call_1(void) { void *p; ! #ifndef HAVE_GETADDRINFO ! hostent_p1 = gethostbyname("yahoo.com"); ! p = gethostbyname("slashdot.org"); ! if (hostent_p1 != p) ! { ! printf("Your gethostbyname() changes the static memory area between calls\n"); ! hostent_p1 = NULL; /* force thread-safe failure report */ ! } ! #endif passwd_p1 = getpwuid(0); p = getpwuid(1); --- 62,95 ---- pthread_join(thread1, NULL); pthread_join(thread2, NULL); ! printf("Add this to your template/$port file:\n\n"); ! ! if (strerror_p1 != strerror_p2) ! printf("STRERROR_THREADSAFE=yes\n"); else ! printf("STRERROR_THREADSAFE=no\n"); ! ! if (passwd_p1 != passwd_p2) ! printf("GETPWUID_THREADSAFE=yes\n"); ! else ! printf("GETPWUID_THREADSAFE=no\n"); + if (hostent_p1 != hostent_p2) + printf("GETHOSTBYNAME_THREADSAFE=yes\n"); + else + printf("GETHOSTBYNAME_THREADSAFE=no\n"); + return 0; } void func_call_1(void) { void *p; ! strerror_p1 = strerror(EACCES); ! /* ! * If strerror() uses sys_errlist, the pointer might change for different ! * errno values, so we don't check to see if it varies within the thread. ! */ passwd_p1 = getpwuid(0); p = getpwuid(1); *************** *** 115,140 **** passwd_p1 = NULL; /* force thread-safe failure report */ } ! strerror_p1 = strerror(EACCES); ! /* ! * If strerror() uses sys_errlist, the pointer might change for different ! * errno values, so we don't check to see if it varies within the thread. ! */ } void func_call_2(void) { void *p; ! #ifndef HAVE_GETADDRINFO ! hostent_p2 = gethostbyname("google.com"); ! p = gethostbyname("postgresql.org"); ! if (hostent_p2 != p) ! { ! printf("Your gethostbyname() changes the static memory area between calls\n"); ! hostent_p2 = NULL; /* force thread-safe failure report */ ! } ! #endif passwd_p2 = getpwuid(2); p = getpwuid(3); --- 99,122 ---- passwd_p1 = NULL; /* force thread-safe failure report */ } ! hostent_p1 = gethostbyname("yahoo.com"); ! p = gethostbyname("slashdot.org"); ! if (hostent_p1 != p) ! { ! printf("Your gethostbyname() changes the static memory area between calls\n"); ! hostent_p1 = NULL; /* force thread-safe failure report */ ! } } void func_call_2(void) { void *p; ! strerror_p2 = strerror(EINVAL); ! /* ! * If strerror() uses sys_errlist, the pointer might change for different ! * errno values, so we don't check to see if it varies within the thread. ! */ passwd_p2 = getpwuid(2); p = getpwuid(3); *************** *** 144,152 **** passwd_p2 = NULL; /* force thread-safe failure report */ } ! strerror_p2 = strerror(EINVAL); ! /* ! * If strerror() uses sys_errlist, the pointer might change for different ! * errno values, so we don't check to see if it varies within the thread. ! */ } --- 126,136 ---- passwd_p2 = NULL; /* force thread-safe failure report */ } ! hostent_p2 = gethostbyname("google.com"); ! p = gethostbyname("postgresql.org"); ! if (hostent_p2 != p) ! { ! printf("Your gethostbyname() changes the static memory area between calls\n"); ! hostent_p2 = NULL; /* force thread-safe failure report */ ! } }