Skip to content
  • Peter Maydell's avatar
    0cb04061
    tests/iothread: Always connect iothread GSource to a GMainContext · 0cb04061
    Peter Maydell authored
    
    
    On older versions of glib (anything prior to glib commit 0f056ebe
    from May 2019), the implementation of g_source_ref() and
    g_source_unref() is not threadsafe for a GSource which is not
    attached to a GMainContext.
    
    QEMU's real iothread.c implementation always attaches its
    iothread->ctx's GSource to a GMainContext created for that iothread,
    so it is OK, but the simple test framework implementation in
    tests/iothread.c was not doing this.  This was causing intermittent
    assertion failures in the test-aio-multithread subtest
    "/aio/multi/mutex/contended" test on the BSD hosts.  (It's unclear
    why only BSD seems to have been affected -- perhaps a combination of
    the specific glib version being used in the VMs and their happening
    to run on a host with a lot of CPUs).
    
    Borrow the iothread_init_gcontext() from the real iothread.c
    and add the corresponding cleanup code and the calls to
    g_main_context_push/pop_thread_default() so we actually use
    the GMainContext we create.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Message-id: 20200106144552.7205-1-peter.maydell@linaro.org
    0cb04061
    tests/iothread: Always connect iothread GSource to a GMainContext
    Peter Maydell authored
    
    
    On older versions of glib (anything prior to glib commit 0f056ebe
    from May 2019), the implementation of g_source_ref() and
    g_source_unref() is not threadsafe for a GSource which is not
    attached to a GMainContext.
    
    QEMU's real iothread.c implementation always attaches its
    iothread->ctx's GSource to a GMainContext created for that iothread,
    so it is OK, but the simple test framework implementation in
    tests/iothread.c was not doing this.  This was causing intermittent
    assertion failures in the test-aio-multithread subtest
    "/aio/multi/mutex/contended" test on the BSD hosts.  (It's unclear
    why only BSD seems to have been affected -- perhaps a combination of
    the specific glib version being used in the VMs and their happening
    to run on a host with a lot of CPUs).
    
    Borrow the iothread_init_gcontext() from the real iothread.c
    and add the corresponding cleanup code and the calls to
    g_main_context_push/pop_thread_default() so we actually use
    the GMainContext we create.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Message-id: 20200106144552.7205-1-peter.maydell@linaro.org
Loading