Comment 6 for bug 1749957

Revision history for this message
Marco Trevisan (TreviƱo) (3v1n0) wrote :

To fix that issue you only need to recompile compiz too. And that's enough.

However, then the tests fail because of a crash inside libglvnd at exit:

#0 0x00007ffff3e0c11b in malloc_consolidate (av=av@entry=0x7ffff415dc20 <main_arena>) at malloc.c:4492
#1 0x00007ffff3e0de08 in _int_free (av=0x7ffff415dc20 <main_arena>, p=<optimized out>, have_lock=0) at malloc.c:4398
#2 0x00007ffff3e1244e in __GI___libc_free (mem=<optimized out>) at malloc.c:3145
#3 0x00007fffed5102dd in __glDispatchDestroyTable (dispatch=0x5555558d63c0) at GLdispatch.c:321
#4 0x00007fffed5df10f in CleanupVendorNameEntry (unused=0x0, pEntry=0x555555944210) at libglxmapping.c:311
#5 0x00007fffed5e8866 in __glXMappingTeardown (doReset=0) at libglxmapping.c:1061
#6 0x00007fffed5dec80 in __glXFini () at libglx.c:2099
#7 0x00007ffff7de621a in _dl_fini () at dl-fini.c:235
#8 0x00007ffff3dbeec0 in __run_exit_handlers (status=0, listp=0x7ffff415d6f8 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true, run_dtors=run_dtors@entry=true) at exit.c:83
#9 0x00007ffff3dbef1a in __GI_exit (status=<optimized out>) at exit.c:105
#10 0x00007ffff3da41c8 in __libc_start_main (main=
    0x5555556b9d45 <main(int, char**)>, argc=1, argv=0x7fffffffd128, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd118) at ../csu/libc-start.c:342
#11 0x000055555568908a in _start ()
(gdb) f 3
#3 0x00007fffed5102dd in __glDispatchDestroyTable (dispatch=0x5555558d63c0) at GLdispatch.c:321
321 free(dispatch->table);
(gdb)

In fact when the nux windowthread is closed, and its graphic display is free'd we do a call to glXDestroyContext which leads to this crash because for some reason the dispatch->table is already free'd by something else (the driver?).

Getting rid of that line fixes the issue, but indeed isn't correct.

There's a comment on __glDispatchDestroyTable saying
    /*
     * XXX: Technically, dispatch->currentThreads should be 0 if we're calling
     * into this function, but buggy apps may unload libGLX without losing
     * current, in which case this won't be true when the dispatch table
     * is destroyed.
     */

Not sure if this is the case though, as it's quite cryptic to me.