I am debuging a problem with the X server, and it deadlocks with a printf that I have added. gdb shows only on thread running.
Do you know how is it possible? My programming knowledge about pthreads programming is near to zero (it coulde be a simple mistake). The process is taking all the cpu. (gdb) info threads Id Target Id Frame * 1 LWP 1 0x00007f7ff4a0b456 in ?? () from /usr/lib/libpthread.so.1 (gdb) bt #0 0x00007f7ff4a0b456 in ?? () from /usr/lib/libpthread.so.1 #1 0x00007f7ff4a0b497 in ?? () from /usr/lib/libpthread.so.1 #2 0x00007f7ff4a0b73b in ?? () from /usr/lib/libpthread.so.1 #3 0x00007f7ff4a0aa53 in pthread_setcancelstate () from /usr/lib/libpthread.so.1 #4 0x00007f7ff430de2a in __flockfile_internal () from /usr/lib/libc.so.12 #5 0x00007f7ff42bcea2 in vfprintf () from /usr/lib/libc.so.12 #6 0x00007f7ff42c117a in fprintf () from /usr/lib/libc.so.12 #7 0x00007f7ff5805761 in drmIoctl () from /usr/X11R7/lib/libdrm.so.3 #8 0x00007f7ff5803ff2 in drmModeMoveCursor () from /usr/X11R7/lib/libdrm.so.3 #9 0x0000000000496e2a in ?? () #10 0x00000000004d1ea5 in ?? () #11 0x00000000004d28f0 in miPointerSetPosition () #12 0x0000000000440dd2 in GetPointerEvents () #13 0x000000000047de4f in xf86PostMotionEventM () #14 0x000000000047dfdc in xf86PostMotionEvent () #15 0x00007f7fef606a05 in ?? () from /usr/X11R7/lib/modules/drivers/mouse_drv.so #16 0x00007f7fef6070a9 in ?? () from /usr/X11R7/lib/modules/drivers/mouse_drv.so #17 0x00007f7fef607a2f in ?? () from /usr/X11R7/lib/modules/drivers/mouse_drv.so #18 0x0000000000471086 in ?? () #19 0x000000000048a4e0 in ?? () #20 0x00007f7ff429f440 in opendir () from /usr/lib/libc.so.12 #21 0x00007fff00000017 in ?? () #22 0x0000000000000000 in ?? () (gdb) And this is the relevant code: (it is inside of libdrm library, file xf86drm.c): ( I added some printfs int drmIoctl(int fd, unsigned long request, void *arg) { int ret; FILE *fd_log; int try,try_eintr,try_eagain; int by_ten; try=0; try_eintr=0; try_eagain=0; by_ten=1; fd_log=fopen("/log.ioctl","a"); fprintf(fd_log,"fd: %d, request: %lu",fd,request); fflush(fd_log); do { ret = ioctl(fd, request, arg); if (ret == -1 && (errno == EINTR || errno == EAGAIN)) { try++; if (errno == EINTR ) try_eintr++; if (errno == EAGAIN ) try_eagain++; if (try == by_ten) { fprintf(fd_log," ei:%d,ea:%d",try_eintr,try_eagain); fflush(fd_log); by_ten=by_ten*10; } } } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); fprintf(fd_log,"\n"); fclose(fd_log); return ret; }