On Thu, May 11, 2023 at 9:12 PM Florian Weimer <fwei...@redhat.com> wrote:
> I'd expect __pthread_setcancelstate to act on asynchronous cancellation
> if it is enabled.  Once you implement that and have a strong symbol
> reference to __pthread_setcancelstate, you'd pull in the cancellation
> unwinder without additional measures, and this would into every program.
> You probably don't want that.  So the reference to the core cancellation
> had better be weak (or use the __libc_ptf_call indirection).
>
> Does this answer your question?  Sorry, these static linking size
> optimizations are tricky.

I think it does, thank you!

As for unwinding: it appears that that htl does call the cleanup
handlers, but without any actual unwinding. It just does this:

  for (handlers = __pthread_get_cleanup_stack ();
       *handlers != NULL;
       *handlers = (*handlers)->__next)
    (*handlers)->__handler ((*handlers)->__arg);

where __pthread_get_cleanup_stack just returns
&__pthread_cleanup_stack. So if we add this immediate cancellation &
cleanup logic to __pthread_setcancelstate, it shouldn't pull in much.

Do user programs in practice rely on the fact that pthread
cancellation does unwinding and so calls object destructors, runs
@finally clauses, etc?

Sergey

Reply via email to