From owner-freebsd-threads@FreeBSD.ORG Wed Oct 8 19:53:25 2008 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8FF011065688 for ; Wed, 8 Oct 2008 19:53:25 +0000 (UTC) (envelope-from bright@elvis.mu.org) Received: from elvis.mu.org (elvis.mu.org [192.203.228.196]) by mx1.freebsd.org (Postfix) with ESMTP id 778D48FC1E for ; Wed, 8 Oct 2008 19:53:25 +0000 (UTC) (envelope-from bright@elvis.mu.org) Received: by elvis.mu.org (Postfix, from userid 1192) id F16891A3C36; Wed, 8 Oct 2008 12:53:24 -0700 (PDT) Date: Wed, 8 Oct 2008 12:53:24 -0700 From: Alfred Perlstein To: John Hein Message-ID: <20081008195324.GM36572@elvis.mu.org> References: <18668.10465.699531.162573@gromit.timing.com> <200810081409.31822.jhb@freebsd.org> <18669.3729.459915.769388@gromit.timing.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <18669.3729.459915.769388@gromit.timing.com> User-Agent: Mutt/1.4.2.3i Cc: Daniel Eischen , freebsd-threads@freebsd.org Subject: Re: pthread_cleanup_push & pthread_cleanup_pop usage X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Oct 2008 19:53:25 -0000 * John Hein [081008 12:48] wrote: > John Baldwin wrote at 14:09 -0400 on Oct 8, 2008: > > Don't Do That (tm). The spec explicitly states that they can be defined as > > macros and that code using it needs to put them in the same block. > > Thanks for the responses. I like deischen's response best to work > around the problem short term, but I suspect that's not very portable. > And as jhb describes using it outside the same block violates the > spirit of intended use. > > Note that the example I gave (pop off the cleanup stack in a catch > block) is not our only "violation". We also push in one function and > either never [explicitly] pop or possibly pop in another function. > > So that leaves me wondering about possible techniques for cleanup on > thread cancellation or exit. Alfred touched on one method, and I see > that pthread_key_create takes an optional destructor, so that sounds > like a possible avenue to explore. I'm positive that you'll have a solution given my starting point within a few hours. :) All the cpp_cleanup_push() needs to do is to: pthread_once() -> set up the pthread_key and destructor as you said. then pthread_getspecific to get the stack if no stack, make one and set it. then push your cleanup function. good luck, -- - Alfred Perlstein