Re: [PATCH v8] linux: Do not spawn a new thread for SIGEV_THREAD (BZ 30558, 27895, 29705, 32833)
Florian Weimer <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <[email protected]> |
* 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.