[PATCH v8] linux: Do not spawn a new thread for SIGEV_THREAD (BZ 30558, 27895, 29705, 32833)

Florian Weimer fw@deneb.enyo.de
Wed Jul 8 20:28:15 GMT 2026


* Carlos O'Donell:

> On 7/8/26 4:04 PM, Carlos O'Donell wrote:
>> On 7/8/26 3:45 PM, Adhemerval Zanella Netto wrote:
>>>
>>>
>>> On 08/07/26 15:05, Carlos O'Donell wrote:
>>>> On 7/7/26 11:59 AM, Adhemerval Zanella wrote:
>>>>> The current timer_create SIGEV_THREAD implementation has some
>>>>> downsides:
>>>>
>>>> Test rt/tst-timer8.c fails if pause() is removed indicating something is
>>>> wrong with the asynchronous cancellation.
>>>>
>>>> Note that pause() should be removed because it's a cancellation point
>>>> which causes the thread to test for cancellation, and it will see the
>>>> bits set by pthread_cancel and cancel.
>>>>
>>>> I don't know why the newe implementation fails to cancel the thread, I just
>>>> know that without pause it should still cancel but doesn't.
>>> It is because the test is built with -fexception and gcc gives the notification
>>> function a DWARF/LSDA unwind whose cleanup actions exist only at call sites.
>>> Asynchronous cancellation that interrupts a PC not inside any call-site region
>>> finds no landing pad there (the while (1)), so the personality routine performs
>>> no cleanup for that frame (the on_cancel registered with pthread_cleanup_push)
>>> and the unwind proceeds straight to thread termination.
>> 
>> Agreed, this means the test needs -fasynchronous-unwind-tables.
>
> The test already has "-fasynchronous-unwind-tables"?

It's the GCC default.

Maybe -fnon-call-exceptions fixes it?  But I think Andreas Schwab
mentioned that GCC does not always put the unwind regions correctly,
so a compiler barrier might be necessary, too.


More information about the Libc-alpha mailing list