UPDATED UnixWare Threads Patch.

Started by Larry Rosenmanover 22 years ago11 messageshackers
Jump to latest
#1Larry Rosenman
ler@lerctr.org

Here is the updated UnixWare threads patch. I need some help to set the
HAVE_POSIX_GETPWUID_R define from configure, but this will suffice for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be most
appreciative.

LER

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	8 Aug 2003 23:53:35 -0000
@@ -40,13 +40,18 @@
 pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
 		   size_t buflen, struct passwd ** result)
 {
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
!defined(HAVE_POSIX_GETPWUID_R)
 	/*
 	 * broken (well early POSIX draft) getpwuid_r() which returns 'struct
 	 * passwd *'
 	 */
 	*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elsif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
 #else
 	/* no getpwuid_r() available, just use getpwuid() */
 	*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	8 Aug 2003 23:53:35 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
 if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
 else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
 fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

Attachments:

pg.patch.2003-08-08application/octet-stream; name=pg.patch.2003-08-08Download+16-3
#2Larry Rosenman
ler@lerctr.org
In reply to: Larry Rosenman (#1)
Re: UPDATED UnixWare Threads Patch.

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman <ler@lerctr.org>
wrote:

Here is the updated UnixWare threads patch. I need some help to set the
HAVE_POSIX_GETPWUID_R define from configure, but this will suffice for
now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be
most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
 pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
 		   size_t buflen, struct passwd ** result)
 {
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
!defined(HAVE_POSIX_GETPWUID_R)
 	/*
 	 * broken (well early POSIX draft) getpwuid_r() which returns 'struct
 	 * passwd *'
 	 */
 	*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
 #else
 	/* no getpwuid_r() available, just use getpwuid() */
 	*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
 if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
 else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
 fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

Attachments:

pg.patch.2003-08-08application/octet-stream; name=pg.patch.2003-08-08Download+16-3
#3Bruce Momjian
bruce@momjian.us
In reply to: Larry Rosenman (#2)
Re: UPDATED UnixWare Threads Patch.

I am going to tackle this one now. I am going to have to add the
configure tests suggested, so each platform doesn't need to know if it
has a Posix _r function or not. I will add the port-specific parts you
mention below. You can test CVS once I am done.

---------------------------------------------------------------------------

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman <ler@lerctr.org>
wrote:

Here is the updated UnixWare threads patch. I need some help to set the
HAVE_POSIX_GETPWUID_R define from configure, but this will suffice for
now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be
most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns 'struct
* passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
#else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

-- 
  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
#4Bruce Momjian
bruce@momjian.us
In reply to: Larry Rosenman (#1)
Re: UPDATED UnixWare Threads Patch.

I have applied just the optimizer change, attached and applied. I will
deal with the thread issues shortly.

---------------------------------------------------------------------------

Larry Rosenman wrote:

Here is the updated UnixWare threads patch. I need some help to set the
HAVE_POSIX_GETPWUID_R define from configure, but this will suffice for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be most
appreciative.

LER

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	8 Aug 2003 23:53:35 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns 'struct
* passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elsif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
#else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	8 Aug 2003 23:53:35 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faqs/FAQ.html

-- 
  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

Attachments:

/bjm/difftext/plainDownload+5-5
#5Bruce Momjian
bruce@momjian.us
In reply to: Larry Rosenman (#2)
Re: UPDATED UnixWare Threads Patch.

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of functions
* that return data in static buffers, like strerror_r() instead of
* strerror(). Other operating systems use pthread_setspecific()
* and pthread_getspecific() internally to allow standard library
* functions to return static data to threaded applications.
*
* Additional confusion exists because many operating systems that
* use pthread_setspecific/pthread_getspecific() also have *_r versions
* of standard library functions for compatibility with operating systems
* that require them. However, internally, these *_r functions merely
* call the thread-safe standard library functions.
*
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid(). Internally,
* getpwuid() calls pthread_setspecific/pthread_getspecific() to return
* static data to the caller in a thread-safe manner. However, BSD/OS
* also has getpwuid_r(), which merely calls getpwuid() and shifts
* around the arguments to match the getpwuid_r() function declaration.
* Therefore, while BSD/OS has getpwuid_r(), it isn't required. It also
* doesn't have strerror_r(), so we can't fall back to only using *_r
* functions for threaded programs.
*
* The current setup is to assume either all standard functions are
* thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the operating system
* requires reentrant function names (NEED_REENTRANT_FUNC_NAMES=yes).
*/

As an additional data point, here is a README comment from Bind 8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to call the
underlying interface (rather than the standard getXbyY() stubs) and get some
reentrance capabilities. Note that the underlying libraries (which we call)
are not all thread-safe, for example, the YP and DNS resolvers. A lot more
work will need to be done before we have full thread safety. But we believe
that the native API for this system does not impose any reentrancy problems.
We don't use global or static variables anywhere except in the getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS) {
struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to return
the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX version of
the function, and I am not sure why the didn't include the POSIX one
too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

---------------------------------------------------------------------------

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman <ler@lerctr.org>
wrote:

Here is the updated UnixWare threads patch. I need some help to set the
HAVE_POSIX_GETPWUID_R define from configure, but this will suffice for
now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be
most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns 'struct
* passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) && 
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
#else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

-- 
  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

Attachments:

/bjm/difftext/plainDownload+48-21
#6Larry Rosenman
ler@lerctr.org
In reply to: Bruce Momjian (#5)
Re: UPDATED UnixWare Threads Patch.

what about the pieces of src/port/unixware to allow the threads stuff?

--On Thursday, August 14, 2003 01:25:48 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of functions
* that return data in static buffers, like strerror_r() instead of
* strerror(). Other operating systems use pthread_setspecific()
* and pthread_getspecific() internally to allow standard library
* functions to return static data to threaded applications.
*
* Additional confusion exists because many operating systems that
* use pthread_setspecific/pthread_getspecific() also have *_r versions
* of standard library functions for compatibility with operating
systems * that require them. However, internally, these *_r
functions merely * call the thread-safe standard library functions.
*
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid(). Internally,
* getpwuid() calls pthread_setspecific/pthread_getspecific() to return
* static data to the caller in a thread-safe manner. However, BSD/OS
* also has getpwuid_r(), which merely calls getpwuid() and shifts
* around the arguments to match the getpwuid_r() function declaration.
* Therefore, while BSD/OS has getpwuid_r(), it isn't required. It
also * doesn't have strerror_r(), so we can't fall back to only using
*_r * functions for threaded programs.
*
* The current setup is to assume either all standard functions are
* thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the operating system
* requires reentrant function names (NEED_REENTRANT_FUNC_NAMES=yes).
*/

As an additional data point, here is a README comment from Bind 8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to call
the underlying interface (rather than the standard getXbyY() stubs) and
get some reentrance capabilities. Note that the underlying libraries
(which we call) are not all thread-safe, for example, the YP and DNS
resolvers. A lot more work will need to be done before we have full
thread safety. But we believe that the native API for this system does
not impose any reentrancy problems. We don't use global or static
variables anywhere except in the getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS) {
struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to return
the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX version of
the function, and I am not sure why the didn't include the POSIX one
too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

-------------------------------------------------------------------------
--

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman
<ler@lerctr.org> wrote:

Here is the updated UnixWare threads patch. I need some help to set
the HAVE_POSIX_GETPWUID_R define from configure, but this will suffice
for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be
most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns 'struct
* passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
# else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

#7Bruce Momjian
bruce@momjian.us
In reply to: Larry Rosenman (#6)
Re: UPDATED UnixWare Threads Patch.

Sorry, patch attached and applied. I also added "SUPPORTS_THREADS=yes",
which was needed.

---------------------------------------------------------------------------

Larry Rosenman wrote:

what about the pieces of src/port/unixware to allow the threads stuff?

--On Thursday, August 14, 2003 01:25:48 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of functions
* that return data in static buffers, like strerror_r() instead of
* strerror(). Other operating systems use pthread_setspecific()
* and pthread_getspecific() internally to allow standard library
* functions to return static data to threaded applications.
*
* Additional confusion exists because many operating systems that
* use pthread_setspecific/pthread_getspecific() also have *_r versions
* of standard library functions for compatibility with operating
systems * that require them. However, internally, these *_r
functions merely * call the thread-safe standard library functions.
*
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid(). Internally,
* getpwuid() calls pthread_setspecific/pthread_getspecific() to return
* static data to the caller in a thread-safe manner. However, BSD/OS
* also has getpwuid_r(), which merely calls getpwuid() and shifts
* around the arguments to match the getpwuid_r() function declaration.
* Therefore, while BSD/OS has getpwuid_r(), it isn't required. It
also * doesn't have strerror_r(), so we can't fall back to only using
*_r * functions for threaded programs.
*
* The current setup is to assume either all standard functions are
* thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the operating system
* requires reentrant function names (NEED_REENTRANT_FUNC_NAMES=yes).
*/

As an additional data point, here is a README comment from Bind 8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to call
the underlying interface (rather than the standard getXbyY() stubs) and
get some reentrance capabilities. Note that the underlying libraries
(which we call) are not all thread-safe, for example, the YP and DNS
resolvers. A lot more work will need to be done before we have full
thread safety. But we believe that the native API for this system does
not impose any reentrancy problems. We don't use global or static
variables anywhere except in the getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS) {
struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to return
the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX version of
the function, and I am not sure why the didn't include the POSIX one
too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

-------------------------------------------------------------------------
--

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman
<ler@lerctr.org> wrote:

Here is the updated UnixWare threads patch. I need some help to set
the HAVE_POSIX_GETPWUID_R define from configure, but this will suffice
for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd be
most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns 'struct
* passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
# else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version check.
+  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

-- 
  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

Attachments:

/bjm/difftext/plainDownload+5-0
#8Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#5)
Re: [PATCHES] UPDATED UnixWare Threads Patch.

I posted this to patches, but the hackers list should be aware of the
current thread library issues.

---------------------------------------------------------------------------

Bruce Momjian wrote:

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of functions
* that return data in static buffers, like strerror_r() instead of
* strerror(). Other operating systems use pthread_setspecific()
* and pthread_getspecific() internally to allow standard library
* functions to return static data to threaded applications.
*
* Additional confusion exists because many operating systems that
* use pthread_setspecific/pthread_getspecific() also have *_r versions
* of standard library functions for compatibility with operating systems
* that require them. However, internally, these *_r functions merely
* call the thread-safe standard library functions.
*
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid(). Internally,
* getpwuid() calls pthread_setspecific/pthread_getspecific() to return
* static data to the caller in a thread-safe manner. However, BSD/OS
* also has getpwuid_r(), which merely calls getpwuid() and shifts
* around the arguments to match the getpwuid_r() function declaration.
* Therefore, while BSD/OS has getpwuid_r(), it isn't required. It also
* doesn't have strerror_r(), so we can't fall back to only using *_r
* functions for threaded programs.
*
* The current setup is to assume either all standard functions are
* thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the operating system
* requires reentrant function names (NEED_REENTRANT_FUNC_NAMES=yes).
*/

As an additional data point, here is a README comment from Bind 8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to call the
underlying interface (rather than the standard getXbyY() stubs) and get some
reentrance capabilities. Note that the underlying libraries (which we call)
are not all thread-safe, for example, the YP and DNS resolvers. A lot more
work will need to be done before we have full thread safety. But we believe
that the native API for this system does not impose any reentrancy problems.
We don't use global or static variables anywhere except in the getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS) {
struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to return
the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX version of
the function, and I am not sure why the didn't include the POSIX one
too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

-- 
  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
#9Larry Rosenman
ler@lerctr.org
In reply to: Bruce Momjian (#7)
Re: UPDATED UnixWare Threads Patch.

The -Kpthread is only valid for cc, not gcc. on gcc you need
-pthread without the leading K.

(My patch had it, but buried in the POSIX_GETPWUID_R noise).

LER

--On Thursday, August 14, 2003 17:13:56 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

Sorry, patch attached and applied. I also added "SUPPORTS_THREADS=yes",
which was needed.

-------------------------------------------------------------------------
--

Larry Rosenman wrote:

what about the pieces of src/port/unixware to allow the threads stuff?

--On Thursday, August 14, 2003 01:25:48 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of
functions * that return data in static buffers, like strerror_r()
instead of * strerror(). Other operating systems use
pthread_setspecific() * and pthread_getspecific() internally to
allow standard library * functions to return static data to
threaded applications. *
* Additional confusion exists because many operating systems that
* use pthread_setspecific/pthread_getspecific() also have *_r
versions * of standard library functions for compatibility with
operating systems * that require them. However, internally,
these *_r functions merely * call the thread-safe standard library
functions. *
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid().
Internally, * getpwuid() calls
pthread_setspecific/pthread_getspecific() to return * static data
to the caller in a thread-safe manner. However, BSD/OS * also has
getpwuid_r(), which merely calls getpwuid() and shifts * around
the arguments to match the getpwuid_r() function declaration. *
Therefore, while BSD/OS has getpwuid_r(), it isn't required. It also
* doesn't have strerror_r(), so we can't fall back to only using
*_r * functions for threaded programs.
*
* The current setup is to assume either all standard functions are
* thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the operating
system * requires reentrant function names
(NEED_REENTRANT_FUNC_NAMES=yes). */

As an additional data point, here is a README comment from Bind 8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to
call the underlying interface (rather than the standard
getXbyY() stubs) and get some reentrance capabilities. Note that
the underlying libraries (which we call) are not all thread-safe,
for example, the YP and DNS resolvers. A lot more work will need to
be done before we have full thread safety. But we believe that the
native API for this system does not impose any reentrancy problems.
We don't use global or static variables anywhere except in the
getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS)
{ struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to return
the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX version of
the function, and I am not sure why the didn't include the POSIX one
too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

----------------------------------------------------------------------
--- --

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman
<ler@lerctr.org> wrote:

Here is the updated UnixWare threads patch. I need some help to set
the HAVE_POSIX_GETPWUID_R define from configure, but this will
suffice for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd
be most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns
'struct * passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
# else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version
check. +  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of
broadcast)--------------------------- TIP 4: Don't 'kill -9' the
postmaster

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

#10Bruce Momjian
bruce@momjian.us
In reply to: Larry Rosenman (#9)
Re: UPDATED UnixWare Threads Patch.

Oh, sorry. I am attaching the new template/unixware. How is this?

---------------------------------------------------------------------------

Larry Rosenman wrote:

The -Kpthread is only valid for cc, not gcc. on gcc you need
-pthread without the leading K.

(My patch had it, but buried in the POSIX_GETPWUID_R noise).

LER

--On Thursday, August 14, 2003 17:13:56 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

Sorry, patch attached and applied. I also added "SUPPORTS_THREADS=yes",
which was needed.

-------------------------------------------------------------------------
--

Larry Rosenman wrote:

what about the pieces of src/port/unixware to allow the threads stuff?

--On Thursday, August 14, 2003 01:25:48 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of
functions * that return data in static buffers, like strerror_r()
instead of * strerror(). Other operating systems use
pthread_setspecific() * and pthread_getspecific() internally to
allow standard library * functions to return static data to
threaded applications. *
* Additional confusion exists because many operating systems that
* use pthread_setspecific/pthread_getspecific() also have *_r
versions * of standard library functions for compatibility with
operating systems * that require them. However, internally,
these *_r functions merely * call the thread-safe standard library
functions. *
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid().
Internally, * getpwuid() calls
pthread_setspecific/pthread_getspecific() to return * static data
to the caller in a thread-safe manner. However, BSD/OS * also has
getpwuid_r(), which merely calls getpwuid() and shifts * around
the arguments to match the getpwuid_r() function declaration. *
Therefore, while BSD/OS has getpwuid_r(), it isn't required. It also
* doesn't have strerror_r(), so we can't fall back to only using
*_r * functions for threaded programs.
*
* The current setup is to assume either all standard functions are
* thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the operating
system * requires reentrant function names
(NEED_REENTRANT_FUNC_NAMES=yes). */

As an additional data point, here is a README comment from Bind 8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to
call the underlying interface (rather than the standard
getXbyY() stubs) and get some reentrance capabilities. Note that
the underlying libraries (which we call) are not all thread-safe,
for example, the YP and DNS resolvers. A lot more work will need to
be done before we have full thread safety. But we believe that the
native API for this system does not impose any reentrancy problems.
We don't use global or static variables anywhere except in the
getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS)
{ struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to return
the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX version of
the function, and I am not sure why the didn't include the POSIX one
too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

----------------------------------------------------------------------
--- --

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman
<ler@lerctr.org> wrote:

Here is the updated UnixWare threads patch. I need some help to set
the HAVE_POSIX_GETPWUID_R define from configure, but this will
suffice for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here, I'd
be most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns
'struct * passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
# else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See -hackers
+# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version
check. +  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of
broadcast)--------------------------- TIP 4: Don't 'kill -9' the
postmaster

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

-- 
  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

Attachments:

/pg/template/unixwaretext/plainDownload
#11Larry Rosenman
ler@lerctr.org
In reply to: Bruce Momjian (#10)
Re: UPDATED UnixWare Threads Patch.

That'll work.

Thanks!

LER

--On Thursday, August 14, 2003 17:25:29 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

Oh, sorry. I am attaching the new template/unixware. How is this?

-------------------------------------------------------------------------
--

Larry Rosenman wrote:

The -Kpthread is only valid for cc, not gcc. on gcc you need
-pthread without the leading K.

(My patch had it, but buried in the POSIX_GETPWUID_R noise).

LER

--On Thursday, August 14, 2003 17:13:56 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

Sorry, patch attached and applied. I also added
"SUPPORTS_THREADS=yes", which was needed.

----------------------------------------------------------------------
--- --

Larry Rosenman wrote:

what about the pieces of src/port/unixware to allow the threads stuff?

--On Thursday, August 14, 2003 01:25:48 -0400 Bruce Momjian
<pgman@candle.pha.pa.us> wrote:

OK, I have applied the attached patch.

Here is the comment I have added to the thread.c file:

/*
* Threading sometimes requires specially-named versions of
functions * that return data in static buffers, like
strerror_r() instead of * strerror(). Other operating systems
use
pthread_setspecific() * and pthread_getspecific() internally to
allow standard library * functions to return static data to
threaded applications. *
* Additional confusion exists because many operating systems
that * use pthread_setspecific/pthread_getspecific() also have
*_r versions * of standard library functions for compatibility
with operating systems * that require them. However,
internally, these *_r functions merely * call the thread-safe
standard library functions. *
* For example, BSD/OS 4.3 uses Bind 8.2.3 for getpwuid().
Internally, * getpwuid() calls
pthread_setspecific/pthread_getspecific() to return * static
data to the caller in a thread-safe manner. However, BSD/OS *
also has getpwuid_r(), which merely calls getpwuid() and shifts *
around the arguments to match the getpwuid_r() function
declaration. * Therefore, while BSD/OS has getpwuid_r(), it isn't
required. It also * doesn't have strerror_r(), so we can't
fall back to only using *_r * functions for threaded programs.
*
* The current setup is to assume either all standard functions
are * thread-safe (NEED_REENTRANT_FUNC_NAMES=no), or the
operating system * requires reentrant function names
(NEED_REENTRANT_FUNC_NAMES=yes). */

As an additional data point, here is a README comment from Bind
8.2.3:

Thread Safety:

It is possible for a thread safe program to be altered to
call the underlying interface (rather than the standard
getXbyY() stubs) and get some reentrance capabilities. Note that
the underlying libraries (which we call) are not all thread-safe,
for example, the YP and DNS resolvers. A lot more work will need
to be done before we have full thread safety. But we believe
that the native API for this system does not impose any reentrancy
problems. We don't use global or static variables anywhere except
in the getXbyY() stubs.

Here is Bind's gethostbyname_r:

HOST_R_RETURN
gethostbyname_r(const char *name, struct hostent *hptr,
HOST_R_ARGS) { struct hostent *he = gethostbyname(name);

HOST_R_ERRNO;

if (he == NULL)
return (HOST_R_BAD);

return (copy_hostent(he, hptr, HOST_R_COPY));
}

As you can see, it merely calls gethostbyname() and adjusts to
return the proper values.

I removed the pre-POSIX getpwuid_r function call and added the POSIX
one. If we need the pre-POSIX one, we can add it with a configure
test, but I would rather find out if someone needs it first. The
original thread patch that was posted had only the pre-POSIX
version of the function, and I am not sure why the didn't include
the POSIX one too, or use that instead of the pre-POSIX one.

There are also a few stylistic function declaration cleanups.

The unixware optimizer changes have already been applied.

-------------------------------------------------------------------
--- --- --

Larry Rosenman wrote:

--On Friday, August 08, 2003 18:56:45 -0500 Larry Rosenman
<ler@lerctr.org> wrote:

Here is the updated UnixWare threads patch. I need some help to
set the HAVE_POSIX_GETPWUID_R define from configure, but this
will suffice for now.

This also includes my recommendation for the Compiler Bug issue.

Please Apply, and if one of the configure guru's can help here,
I'd be most appreciative.

Grr. I'm an idiot, the following is a CORRECTED version, basically
s/#elsif/#elif/

Index: src/port/thread.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- src/port/thread.c	8 Aug 2003 03:09:56 -0000	1.2
+++ src/port/thread.c	9 Aug 2003 00:47:00 -0000
@@ -40,13 +40,18 @@
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,
size_t buflen, struct passwd ** result)
{
-#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R)
+#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
!defined(HAVE_POSIX_GETPWUID_R)
/*
* broken (well early POSIX draft) getpwuid_r() which returns
'struct * passwd *'
*/
*result = getpwuid_r(uid, resultbuf, buffer, buflen);
+#elif defined(USE_THREADS) && defined(HAVE_GETPWUID_R) &&
defined(HAVE_POSIX_GETPWUID_R)
+	/*
+	 * SUSv2/POSIX getpwuid_r
+	 */
+	return getpwuid_r(uid, resultbuf, buffer, buflen, result);
# else
/* no getpwuid_r() available, just use getpwuid() */
*result = getpwuid(uid);
Index: src/template/unixware
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/template/unixware,v
retrieving revision 1.11
diff -u -r1.11 unixware
--- src/template/unixware	4 Sep 2002 22:54:18 -0000	1.11
+++ src/template/unixware	9 Aug 2003 00:47:00 -0000
@@ -1,5 +1,13 @@
+SUPPORTS_THREADS=yes
if test "$GCC" = yes; then
-  CFLAGS=-O2
+  CFLAGS="-O2 -DHAVE_POSIX_GETPWUID_R"
+  THREAD_CFLAGS="-pthread -D_REENTRANT"
+  NEED_REENTRANT_FUNC_NAMES=yes
else
-  CFLAGS='-O -K inline'
+# the -Kno_host is temporary for a bug in the compiler.  See
-hackers +# discussion on 7-8/Aug/2003.
+# when the 7.1.3UP3 or later compiler is out, we can do a version
check. +  CFLAGS='-O -Kinline,no_host  -DHAVE_POSIX_GETPWUID_R'
+  THREAD_CFLAGS="-D_REENTRANT -K pthread -DHAVE_POSIX_GETPWUID_R"
+  NEED_REENTRANT_FUNC_NAMES=yes
fi

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

[ Attachment, skipping... ]

---------------------------(end of
broadcast)--------------------------- TIP 4: Don't 'kill -9' the
postmaster

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749

--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 972-414-9812 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749