From owner-freebsd-hackers@FreeBSD.ORG  Sat Jul 12 12:07:52 2003
Return-Path: <owner-freebsd-hackers@FreeBSD.ORG>
Delivered-To: freebsd-hackers@freebsd.org
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id A9C9A37B401
	for <hackers@freebsd.org>; Sat, 12 Jul 2003 12:07:52 -0700 (PDT)
Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 0592D43FAF
	for <hackers@freebsd.org>; Sat, 12 Jul 2003 12:07:52 -0700 (PDT)
	(envelope-from eischen@vigrid.com)
Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4])
	by mail.pcnet.com (8.12.8/8.12.1) with ESMTP id h6CJ6UAI012876;
	Sat, 12 Jul 2003 15:06:30 -0400 (EDT)
Date: Sat, 12 Jul 2003 15:06:30 -0400 (EDT)
From: Daniel Eischen <eischen@vigrid.com>
X-Sender: eischen@pcnet5.pcnet.com
To: Joshua Oreman <oremanj@www.get-linux.org>
In-Reply-To: <20030712172948.GC25971@webserver.get-linux.org>
Message-ID: <Pine.GSO.4.10.10307121459430.11837-100000@pcnet5.pcnet.com>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
cc: hackers@freebsd.org
Subject: Re: getpwnam + getpwnam_r + LinuxThreads port = deadlock
X-BeenThere: freebsd-hackers@freebsd.org
X-Mailman-Version: 2.1.1
Precedence: list
Reply-To: deischen@freebsd.org
List-Id: Technical Discussions relating to FreeBSD
	<freebsd-hackers.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/freebsd-hackers>,
	<mailto:freebsd-hackers-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/freebsd-hackers>
List-Post: <mailto:freebsd-hackers@freebsd.org>
List-Help: <mailto:freebsd-hackers-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/freebsd-hackers>,
	<mailto:freebsd-hackers-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 12 Jul 2003 19:07:53 -0000

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