Date: Wed, 8 Oct 2008 12:53:24 -0700 From: Alfred Perlstein <alfred@freebsd.org> To: John Hein <jhein@timing.com> Cc: Daniel Eischen <deischen@freebsd.org>, freebsd-threads@freebsd.org Subject: Re: pthread_cleanup_push & pthread_cleanup_pop usage Message-ID: <20081008195324.GM36572@elvis.mu.org> In-Reply-To: <18669.3729.459915.769388@gromit.timing.com> References: <18668.10465.699531.162573@gromit.timing.com> <200810081409.31822.jhb@freebsd.org> <18669.3729.459915.769388@gromit.timing.com>
next in thread | previous in thread | raw e-mail | index | archive | help
* John Hein <jhein@timing.com> [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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20081008195324.GM36572>