On 02/11/2018 14:33, Peter Maydell wrote:
> On 9 October 2018 at 12:16, Paolo Bonzini <pbonz...@redhat.com> wrote:
>> On 08/10/2018 18:40, Kevin Wolf wrote:
>>>>
>>>> I'm pretty confident this analysis of the problem is correct:
>>>> unfortunately I have no idea what the right way to fix it is...
>>> Yes, I agree with your analysis. If __thread variables can be destructed
>>> before pthread_key_create() destructors are called (and in particular if
>>> the former are implemented in terms of the latter), this implies at
>>> least two rules:
>>>
>>> 1. The Notfier itself can't be a TLS variable
>>>
>>> 2. The notifier callback can't access any TLS variables
>>>
>>> Of course, with these restrictions, qemu_thread_atexit_*() with its
>>> existing API is as useless as it could be.
>>
>> Yup, we have to stop using pthread_key_create.  Luckily, these days
>> there is always qemu_thread_start that wraps the thread, so we can call
>> qemu_thread_atexit_run from there, and change exit_key to a thread-local
>> NotifierList.
> 
> We would also need to catch exits via qemu_thread_exit(), right?
> We probably also need to handle the main thread specially, via
> atexit(). This seems to be pretty much what we already do in
> util/qemu-thread-win32.c...

There's only one caller of qemu_thread_exit and it can be removed easily.

However, an improvement on the idea is to use pthread_cleanup_push/pop
in qemu_thread_start.  This does handle qemu_thread_exit.

Thanks,

Paolo

Reply via email to