Date: Sat, 12 Jul 2003 10:29:49 -0700 From: Joshua Oreman <oremanj@webserver.get-linux.org> To: deischen@freebsd.org Cc: hackers@freebsd.org Subject: Re: getpwnam + getpwnam_r + LinuxThreads port = deadlock Message-ID: <20030712172948.GC25971@webserver.get-linux.org> In-Reply-To: <Pine.GSO.4.10.10307121039090.7013-100000@pcnet5.pcnet.com> References: <20030712055248.GA23189@webserver.get-linux.org> <Pine.GSO.4.10.10307121039090.7013-100000@pcnet5.pcnet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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 :-) Then again, if there's a pthread-compatible wrapper around libthr, I might be able to consider it... Well, I think I'll probably do 1) for future users, and 4) (switch to libpth) for now :-) -- Josh > > -- > Dan Eischen
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030712172948.GC25971>