On 02.11.2017 20:45, Joerg Sonnenberger wrote:
> On Thu, Nov 02, 2017 at 07:09:34PM +0100, Kamil Rytarowski wrote:
>> TSan intercepts all atexit() and __cxa_atexit() calls and wraps them in
>> setup_at_exit_wrapper(() into a new struct that preserves the original
>> arguments "a" and "b" from __cxa_atexit() / "a" from atexit(). In case
>> of intercepting atexit() calls we end up with __cxa_atexit(x,y,NULL). In
>> libc we handle this variation in the same way as atexit(x) and drop the
>> "y" argument.
>
> It should be intercepting atexit separately and just providing its own
> stack, followed by registering a pop-and-call handler via the real
> atexit, i.e.:
>
> std::vector<h> atexit_stack;
> void my_cleanup(void) {
> h = atexit_stack.pop();
> h();
> }
>
> int intercepted_atexit(h) {
> atexit_stack.push(h);
> rv = real_atexit(my_cleanup);
> if (rv) atexit_stack.pop();
> return rv;
> }
>
> Joerg
>
Is this stack order deterministic? If so, I will go for it.
Attachment:
signature.asc
Description: OpenPGP digital signature