Hello everyone,

I think I found a bug with OSWindow when using the X11 server :

Everytime you open an OSWindow (it doesn't matter what you do with it, you
can even close it you just need to have opened an OSWindow once) when you
want to quit your image you get a segmentation fault on the
"quitPrimitive". Or sometimes you can have a error: "double free or
corruption (out)".

To reproduce it you just have to open an empty OSWindow with "OSWindow
new." then close it and close your image.

It is not a big problem because the image is still saved and closed and
nothing bad happens when you reopen it but it is just frustrating to have a
segfault everytime you close your image.

I've been able to get a C stack backtrace :

/home/matthieu/Documents/Pharo5/pharo-vm/pharo[0x80a3352]
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo[0x80a36a3]
> [0xf772a410]
> /lib/i386-linux-gnu/libpthread.so.0(__pthread_mutex_lock+0x16)[0xf76a5036]
> /usr/lib/i386-linux-gnu/libX11.so.6(+0x23f0d)[0xf710df0d]
> /usr/lib/i386-linux-gnu/libX11.so.6(XrmDestroyDatabase+0x2d)[0xf712888d]
>
> /usr/lib/i386-linux-gnu/libX11.so.6(_XFreeDisplayStructure+0x473)[0xf710fbf3]
> /usr/lib/i386-linux-gnu/libX11.so.6(XCloseDisplay+0xd9)[0xf70fd0f9]
>
> /home/matthieu/Documents/Pharo5/pharo-vm/vm-display-X11(disconnectXDisplay+0xcf)[0xf771dd3f]
>
> /home/matthieu/Documents/Pharo5/pharo-vm/vm-display-X11(+0x11d74)[0xf771dd74]
>
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo(ioExitWithErrorCode+0x20)[0x80a3990]
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo[0x807551f]
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo(interpret+0x234c)[0x80973cc]
>
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo(enterSmalltalkExecutiveImplementation+0x59)[0x809a5c9]
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo(interpret+0x1ee)[0x809526e]
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo(main+0x2b2)[0x805ba82]
> /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xf7507a83]
> /home/matthieu/Documents/Pharo5/pharo-vm/pharo[0x805bda1]
>


By digging up a bit I think I may have a hint about why this happens :

When you initialize the X11 server you need to make a choice about calling
XInitThreads() or not.
Here is a part of the man of XInitThreads() :

*The XInitThreads function initializes Xlib support for concurrent threads.
> This function must be the first Xlib function a multi-threaded program
> calls, and it must complete before any other Xlib call is made. This
> function returns a nonzero status if initialization was successful;
> otherwise, it returns zero. On systems that do not support threads, this
> function always returns zero. *
>
> *It is only necessary to call this function if multiple threads might use
> Xlib concurrently. If all calls to Xlib functions are protected by some
> other access mechanism (for example, a mutual exclusion lock in a toolkit
> or through explicit client programming), Xlib thread initialization is not
> required. It is recommended that single-threaded programs not call this
> function.*
>

I've searched a bit in the Pharo VM code and I have not found any call to
XInitThreads() and it seems normal because it only opens one window in a
single thread.

Now the problem is that SDL makes a call to XinitThreads() in the file
"SDL_x11video.c" in the function : "X11_CreateDevice(int devindex)" because
SDL needs it.

This means basically that the XinitThreads() function is called from the
same process than the VM one after the first Xlib calls have been made.

So to sum up, the VM initializes the X server in single thread mode. Then
SDL changes it to multi thread mode so the X server probably creates a
mutex to handle everything. Now when we try to close the VM the main window
that was opened in single thread mode makes the mutex crash and it results
in a segfault.

If I am right it means that adding a call to XInitThreads() in the
initialization of the X11 server in the VM code could maybe solve this
problem.

What do you think about it ?

Cheers,

Matthieu

Reply via email to