Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Jul 2003 15:06:30 -0400 (EDT)
From:      Daniel Eischen <eischen@vigrid.com>
To:        Joshua Oreman <oremanj@www.get-linux.org>
Cc:        hackers@freebsd.org
Subject:   Re: getpwnam + getpwnam_r + LinuxThreads port = deadlock
Message-ID:  <Pine.GSO.4.10.10307121459430.11837-100000@pcnet5.pcnet.com>
In-Reply-To: <20030712172948.GC25971@webserver.get-linux.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 12 Jul 2003, Joshua Oreman wrote:

> 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.
> 
> Not an option, as my app needs to be runnable on both BSD
> and Linux. (So LinuxThreads was a natural choice :-)

Umm, what are you talking about?  Both libkse and libthr
implement POSIX threads interfaces.  Your code doesn't
have to change; you just link to libkse (-lkse) or
libthr (-lthr).  When you compile on Linux, you link
to linuxthreads (-lwhatever).  You are not running
a FreeBSD binary on Linux, nor running a Linux binary
on FreeBSD, right?

-- 
Dan Eischen



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10307121459430.11837-100000>