From owner-freebsd-hackers@FreeBSD.ORG Sat Jul 12 07:47:57 2003 Return-Path: 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 36CAF37B401 for ; Sat, 12 Jul 2003 07:47:57 -0700 (PDT) Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id DBBA743F93 for ; Sat, 12 Jul 2003 07:47:54 -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 h6CEloAI008298; Sat, 12 Jul 2003 10:47:50 -0400 (EDT) Date: Sat, 12 Jul 2003 10:47:50 -0400 (EDT) From: Daniel Eischen X-Sender: eischen@pcnet5.pcnet.com To: Joshua Oreman In-Reply-To: <20030712055248.GA23189@webserver.get-linux.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: freebsd-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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 12 Jul 2003 14:47:57 -0000 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). 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). 3) CVSup to the latest 5.x and use libthr or libkse and forget linuxthreads. -- Dan Eischen