retitle 246643 libx11-6: _XPollfdCacheDel() select()s forever when called by 
fglrx_dri.so
tag 246643 + moreinfo upstream help
thanks

On Fri, Apr 30, 2004 at 01:48:16AM -0500, Mike Mestnik wrote:
> Package: libx11-6
> Version: 4.3.0-7
> Severity: normal
> 
> (gdb) bt
> #0  0x403e3398 in select () from /lib/tls/libc.so.6
> #1  0x4018de32 in _XPollfdCacheDel () from /usr/X11R6/lib/libX11.so.6
> #2  0x4018eda1 in _XRead () from /usr/X11R6/lib/libX11.so.6
> #3  0x4093c2d9 in s5943 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #4  0x40950593 in s3197 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #5  0x4094d984 in s3176 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #6  0x4094ccff in s5118 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #7  0x4094d02a in __driCreateScreen () from
> /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #8  0x40123fda in AllocAndFetchScreenConfigs () from /usr/X11R6/lib/libGL.so.1
> 
> I also got this bt with DRI installed, but they do not replace libX11.so.
> (gdb) bt
> #0  0x4027d398 in select () from /lib/tls/libc.so.6
> #1  0x40103e32 in _XPollfdCacheDel () from /usr/X11R6/lib/libX11.so.6
> #2  0x40104da1 in _XRead () from /usr/X11R6/lib/libX11.so.6
> #3  0x407dc2d9 in s5943 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #4  0x407f0593 in s3197 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #5  0x407ed984 in s3176 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #6  0x407eccff in s5118 () from /usr/X11R6/lib/modules/dri/fglrx_dri.so
> #7  0x407ed02a in __driCreateScreen () from /usr/X11R6/lib/libGL.so.1

Well, here are the sources to _XRead() and _XPollfdCacheDel().  Both
live in xc/lib/X11/XlibInt.c.

/* 
 * _XRead - Read bytes from the socket taking into account incomplete
 * reads.  This routine may have to be reworked if int < long.
 */
int _XRead (dpy, data, size)
        register Display *dpy;
        register char *data;
        register long size;
{
        register long bytes_read;
#ifdef XTHREADS
        int original_size = size;
#endif

        if ((dpy->flags & XlibDisplayIOError) || size == 0)
            return 0;
        ESET(0);
        while ((bytes_read = _X11TransRead(dpy->trans_conn, data, (int)size))
                != size) {

                if (bytes_read > 0) {
                    size -= bytes_read;
                    data += bytes_read;
                    }
                else if (ETEST()) {
                    if (_XWaitForReadable(dpy) == -2)
                        return -2; /* internal connection did XPutBackEvent */
                    ESET(0);
                }
#ifdef SUNSYSV
                else if (ECHECK(0)) {
                    if (_XWaitForReadable(dpy) == -2)
                        return -2; /* internal connection did XPutBackEvent */
                }
#endif
                else if (bytes_read == 0) {
                    /* Read failed because of end of file! */
                    ESET(EPIPE);
                    _XIOError(dpy);
                    }

                else  /* bytes_read is less than 0; presumably -1 */ {
                    /* If it's a system call interrupt, it's not an error. */
                    if (!ECHECK(EINTR))
                        _XIOError(dpy);
                    }
                 }
#ifdef XTHREADS
       if (dpy->lock && dpy->lock->reply_bytes_left > 0)
       {
           dpy->lock->reply_bytes_left -= original_size;
           if (dpy->lock->reply_bytes_left == 0) {
               dpy->flags &= ~XlibDisplayReply;
               UnlockNextReplyReader(dpy);
           }
       }
#endif /* XTHREADS*/
        return 0;
}

/* ARGSUSED */
void _XPollfdCacheDel(dpy, fd)
    Display *dpy;
    int fd;                     /* not used */
{
#ifdef USE_POLL
    struct pollfd *pfp = (struct pollfd *)dpy->filedes;
    struct _XConnectionInfo *conni;

    /* just recalculate whole list */
    if (dpy->im_fd_length <= POLLFD_CACHE_SIZE) {
        int loc = 1;
        for (conni = dpy->im_fd_info; conni; conni=conni->next) {
            pfp[loc].fd = conni->fd;
            pfp[loc].events = POLLIN;
            loc++;
        }
    }
#endif
}

Would someone like to eyeball the above?

-- 
G. Branden Robinson                |    Humor is a rubber sword - it allows
Debian GNU/Linux                   |    you to make a point without drawing
[EMAIL PROTECTED]                 |    blood.
http://people.debian.org/~branden/ |    -- Mary Hirsch

Attachment: signature.asc
Description: Digital signature

Reply via email to