From owner-freebsd-threads@FreeBSD.ORG Wed Jun 4 09:45:21 2003 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7942437B401 for ; Wed, 4 Jun 2003 09:45:21 -0700 (PDT) Received: from matou.sibbald.com (matou.sibbald.com [195.202.201.48]) by mx1.FreeBSD.org (Postfix) with ESMTP id BA17A43F3F for ; Wed, 4 Jun 2003 09:45:19 -0700 (PDT) (envelope-from kern@sibbald.com) Received: from [192.168.68.112] (rufus [192.168.68.112]) by matou.sibbald.com (8.11.6/8.11.6) with ESMTP id h54GjFv15149; Wed, 4 Jun 2003 18:45:15 +0200 From: Kern Sibbald To: Daniel Eischen In-Reply-To: References: Content-Type: text/plain Organization: Message-Id: <1054745115.13630.517.camel@rufus> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.4 Date: 04 Jun 2003 18:45:15 +0200 Content-Transfer-Encoding: 7bit cc: freebsd-threads@freebsd.org Subject: Re: FreeBSD pthread_equal "bug" X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 Jun 2003 16:45:21 -0000 On Wed, 2003-06-04 at 17:30, Daniel Eischen wrote: > On 4 Jun 2003, Kern Sibbald wrote: > > Hello, > > > > I've run into what I consider a bug in the FreeBSD > > implementation of pthreads and pthread_equal() in > > particular. Basically, pthread_equal() will return > > true even if it is not the same thread. This can occur > > when one thread dies and another one starts. The second > > thread then takes on the exact identity of the the > > first thread, and pthread_equal() returns true for a > > case where it is a different thread. You may argue > > that the first thread is dead so its thread id is no > > longer valid. True, but think about how Unix would > > work if every process started up with the process > > id of the last process to exit. > > Process id's can wrap around so it can eventually happen. Yes, true. However, on Solaris and Linux, it takes a long time, for the pthread_id to wrap around, and on FreeBSD it happens in microseconds. > > This is a bug in the application; the implementation is allowed > to reuse thread id's and there are enough interfaces for an > application to tell when a thread terminates (pthread_join). I'm not sure what the POSIX specification says, if I were programming it, I would not be content with the FreeBSD current implementation especially considering that both Solaris and Linux do it "correctly". > Perhaps our use of thread id's could be changes so that they > were cached at the end of the free thread list, but cacheing > them at the front seems to highlight bad applications, so > that's a bonus ;-) This bug does not highlight bad applications because most programmers will reasonably expect that pthread_equal() will not be the same for two different threads. It took me a long time to find this problem because I just could not imagine that pthread_equal() was not "working". This problem is extremely subtle and is likely to cause unsuspecting applications long months of bizarre behavior. Fix it or not, that is your choice. Now that I know that you don't handle it as I would suspect I can code around it.