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