XWin crash after the launch of startkde on a remote Red Hat 5 machine

Michel Hummel hummel.michel@gmail.com
Tue Aug 3 07:55:00 GMT 2010


Hello,
I'm using cygwin on Microsoft Windows XP with XWin version :
sh-3.2# XWin.exe -version
Welcome to the XWin X Server
Vendor: The Cygwin/X Project
Release: 1.8.0.0 (10800000)
Build Date: 2010-04-02
Contact: cygwin-xfree@cygwin.com

I think I have found a bug in the XWin reset procedure which leads to
the start of two clipboard thread's and sometime to a crash of the X
server.

The crash can be produced by lauching startkde on a Red Hat 5 remote
machine (The crash should arrive after some minutes of work)
but the bug can simply be produced like this :

On my installation if I launch Xwin with this options :
XWin :0 -ac&
then I do
xsetroot -solid '#FFFF00'

After setting the color, Xwin launches its reset procedure because
there is no more client connected ( the server loses the color but it
is the normal comportment isn't it ?
http://sourceware.org/ml/cygwin-xfree/2002-01/msg00106.html)

The problem comes from the clipboard thread. In this example, when the
server launches its reset procedure, the clipboard is in state
"Launched" but is not in state "Started" (Boolean variable about
clipboard status, see file hw/xwin/winclipboardthread.c).

This particular status of the ClipboardThread during server reset is
normaly managed by two "if" statements :

* An "if" in the file hw/xwin/InitOutput.c disables the exit of the
clipboard thread in this state
Extract of the file hw/xwin/InitOutput.c (with line number) :

 169 winClipboardShutdown (void)
 170 {
 171   /* Close down clipboard resources */
 172   if (g_fClipboard && g_fClipboardLaunched && g_fClipboardStarted)
 173     {
 174       /* Synchronously destroy the clipboard window */
 175       if (g_hwndClipboard != NULL)
 176         {
 177           SendMessage (g_hwndClipboard, WM_DESTROY, 0, 0);
 178           /* NOTE: g_hwndClipboard is set to NULL in
winclipboardthread.c */
 179         }
 180       else
 181         return;
 182
 183       /* Wait for the clipboard thread to exit */
 184       pthread_join (g_ptClipboardProc, NULL);
 185
 186       g_fClipboardLaunched = FALSE;
 187       g_fClipboardStarted = FALSE;
 188
 189       winDebug ("winClipboardShutdown - Clipboard thread has exited.\n");
 190     }
 191 }

* An "if" statement in the file hw/xwin/winclipboardwrappers.c
prohibits the launch of clipboard thread if one is already Launched.
Extract of the file hw/xwin/winclipboardwrappers.c (with line number)
256   /* If the clipboard client has already been started, abort */
257   if (g_fClipboardLaunched)
258     {
259       ErrorF ("winProcEstablishConnection - Clipboard client already "
260               "launched, returning.\n");
261       return iReturn;
262     }


The problem is that the Boolean variables g_fClipboardLaunched and
g_fClipboardStarted are re-initialized by the server reset procedure
(function winInitializeGlobals of the file  hw/xwin/winglobals.c)
Extract of the file hw/xwin/winglobals.c (with line number)
128 /*
129  * Re-initialize global variables that are invalidated 130  * by a
server reset.
131  */
132
133 void
134 winInitializeGlobals (void)
135 {
136   g_dwCurrentThreadID = GetCurrentThreadId ();
137   g_hwndKeyboardFocus = NULL;
138 #ifdef XWIN_CLIPBOARD
139   g_fClipboardLaunched = FALSE;
140   g_fClipboardStarted = FALSE;
141   g_iClipboardWindow = None;
142   g_pClipboardDisplay = NULL;
143   g_atomLastOwnedSelection = None;
144   g_hwndClipboard = NULL;
145 #endif
146 }

The consequence of this Re-initialization in this particular situation
is that the clipboard thread is launched two times and sometimes leads
to a crash of the X server.
You can see the double launch of the clipboard thread at the end of
the attached log file Xwin.0.log ( 2 times the sentence :
winClipboardProc - XOpenDisplay () returned and successfully opened
the display. )

To fix this bug I purpose to remove the variables g_fClipboardLaunched
and g_fClipboardStarted of the "winInitializeGlobals (void)" function,
as their re-initializations are handled in in the files :
hw/xwin/InitOutput.c.

That what is doing the patch Attached to this email.

Regards,
Michel Hummel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: XWin_winglobals_ClipboardThread.patch
Type: application/octet-stream
Size: 570 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin-xfree/attachments/20100803/f3685aa2/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: XWin.0.log
Type: application/octet-stream
Size: 5054 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin-xfree/attachments/20100803/f3685aa2/attachment-0001.obj>
-------------- next part --------------
--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/


More information about the Cygwin-xfree mailing list