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