Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Jul 2003 13:15:24 +0200
From:      "Kai Mosebach" <kai.mosebach@freshx.de>
To:        <deischen@freebsd.org>
Cc:        freebsd-threads@freebsd.org
Subject:   AW: getpwnam + getpwnam_r + LinuxThreads port = deadlock
Message-ID:  <000601c349f9$39b69fe0$0100000a@alpha>
In-Reply-To: <Pine.GSO.4.10.10307121459430.11837-100000@pcnet5.pcnet.com>

next in thread | previous in thread | raw e-mail | index | archive | help

> -----Urspr=FCngliche Nachricht-----
> Von: owner-freebsd-hackers@freebsd.org [mailto:owner-freebsd-
> hackers@freebsd.org] Im Auftrag von Daniel Eischen
> Gesendet: Samstag, 12. Juli 2003 21:07
> An: Joshua Oreman
> Cc: hackers@freebsd.org
> Betreff: Re: getpwnam + getpwnam_r + LinuxThreads port =3D deadlock
>=20
> On Sat, 12 Jul 2003, Joshua Oreman wrote:
>=20
> > On Sat, Jul 12, 2003 at 10:47:50AM -0400 or thereabouts, Daniel
Eischen
> wrote:
> > > On Fri, 11 Jul 2003, Joshua Oreman wrote:
> > >
> > > > Hi -hackers,
> > > >
> > > > System: FreeBSD 5.0-CURRENT cvsupped around 5.0-RELEASE
> > > >
> > > > I'm writing an app that links with the LinuxThreads
> > > > (/usr/ports/devel/linuxthreads) and also uses getpwnam(). The
> problem:
> > > > a deadlock. GDB backtrace:
> > > >
> > > > Basically: FreeBSD implements getpwnam() as a wrapper around
> > > > getpwnam_r(), as seen in src/lib/libc/gen/getpwent.c:
> > > >
> > > > So basically, my app calls getpwnam(), which calls the
overridden
> > > > getpwnam_r() from LinuxThreads, which calls getpwnam() from libc
> > > > again, and then calls getpwnam_r() from LinuxThreads again, and
> > > > deadlocks trying to recursively lock its own mutex.  Obviously,
if
> > > > there was no mutex the stack would leak out the back of my
computer
> > > > :-)
> > > >
> > > > Any ideas here?
> > >
> > > Three ideas:
> > >
> > >   1) Change the linuxthreads port to not implement getpwname
> > >      in the way that it is (or at all and let it use libc's
> > >      version).
> >
> > Probably the easiest way; just include the getpw(nam|uid)_r
> > code in #ifndef BSD (or #ifndef __FreeBSD__ if it's only
> > a FBSD problem).
> >
> > >
> > >   2) Change libc so that getpwnam and getpwnam_r are weak
> > >      references to _getpwnam and _getpwnam_r respectively
> > >      and have the "_" versions be the real implementation.
> > >      Make all references in libc use _getpwname and
> > >      _getpwnam_r (including the call to _getpwnam_r in
> > >      _getpwnam).
> >
> > I think this would still cause the same problem, but not sure.
> >
> > >
> > >   3) CVSup to the latest 5.x and use libthr or libkse and
> > >      forget linuxthreads.
> >

I am having the same problems in my sapdb port, as mentioned in another
mail. For me its also not this simple to simply switch to kse, because
then
other kse related problems occur.

Wouldnt it be more "clean", to fix the issue in the linuxthreads
implementation instead ? (For example many users might use linuxthreads
for mysql compilation for example, not knowing what they await ...)

Btw : why was this problem not occuring in 5.0-RELEASE ?

Cheers Kai



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?000601c349f9$39b69fe0$0100000a>