Re: UPDATED UnixWare Threads Patch.

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Larry Rosenman <ler(at)lerctr(dot)org>
Cc: pgsql-patches(at)postgresql(dot)org
Subject: Re: UPDATED UnixWare Threads Patch.
Date: 2003-08-14 05:25:48
Message-ID: 200308140525.h7E5Pmh18516@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-patches


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(at)lerctr(dot)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(at)lerctr(dot)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(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

Attachment Content-Type Size
unknown_filename text/plain 4.0 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Neil Conway 2003-08-14 06:06:41 Re: Statement-level Triggers
Previous Message Tatsuo Ishii 2003-08-14 02:14:24 test

Browse pgsql-patches by date

  From Date Subject
Next Message Larry Rosenman 2003-08-14 09:04:40 Re: UPDATED UnixWare Threads Patch.
Previous Message Bruce Momjian 2003-08-14 00:00:29 Re: UPDATED UnixWare Threads Patch.