[Xcb] [Bug 41870] New: XSync never return , when XNextEvent runs in separate thread

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Mon Oct 17 04:35:05 PDT 2011


https://bugs.freedesktop.org/show_bug.cgi?id=41870

             Bug #: 41870
           Summary: XSync never return , when XNextEvent runs in separate
                    thread
    Classification: Unclassified
           Product: XCB
           Version: unspecified
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: critical
          Priority: medium
         Component: Library
        AssignedTo: xcb at lists.freedesktop.org
        ReportedBy: arvind.umrao at oracle.com
         QAContact: xcb at lists.freedesktop.org


With libx11-xcb, XSync never returns, when XnextEvent run in separate thread,
causing Java application crash.  With legacy libX11 XSync never hang, it should
be the same case with libX11-xcb. To reproduce the problem, please compile code
with cc sample.c -lX11, then run it. You will not see any print messages.  



#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>
#include<X11/Xlib.h>
#include<X11/Xutil.h>

Display *dsp;
Window win;
int screen;
XEvent evt;

void * mythread(void *arg) {

    XSelectInput(dsp, win, ExposureMask | ButtonPressMask);
    while (1) {
        XNextEvent(dsp, &evt); /* Lock Display in S11 */
        switch (evt.type) {
            case Expose:
                break;
                ;
            case ButtonPress:
                fprintf(stderr, "Button pressed in thread\n");
        }
    }
}

int main(int ac, char *av[]) {

    pthread_t tid_a;
    int arg_thread = 100;

    XEvent ev;

    XInitThreads();
    if ((dsp = XOpenDisplay("")) == NULL) {
        fprintf(stderr, "Can not open Display\n");
        return (-1);
    }

    screen = DefaultScreen(dsp);
    win = XCreateSimpleWindow(dsp, DefaultRootWindow(dsp), 10, 10, 200, 100,
            5, WhitePixel(dsp, screen), BlackPixel(dsp, screen));
    XMapRaised(dsp, win);

    int status = pthread_create(&tid_a, NULL, mythread, &arg_thread);

    /* do some long task */
    sleep(1);

    XSync(dsp, True); /* <= hung here */

    /* Execution never comes here */

    fprintf(stderr, "\nWith legacy libX11 you can see this messsage \n");
    fprintf(stderr, "But with libX11-xcb you will never see this message.\n");

    /* wait threads */
    status = pthread_join(tid_a, NULL);
    return (0);
}

-- 
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the Xcb mailing list