Yeah, sorry I wasn't more clear. It's at the second backtrace below that dev->deviceGrab.sync.other is written to which in turn causes FreezeThaw to freeze the events (CheckGrabForSyncs calls ComputeFreezes at the end). Where it's supposed to be cleared I don't know. I'll see if I have time to get a -O0 server compiled this weekend, obviously otherMode can't really be 0 there it has to be an optimization thing, and there's some inlined frames missing. But I'm pretty full booked... -- Pelle Johansson 17 okt 2009 kl. 01.42 skrev Jeremy Huddleston:
Well, FWICT, the problem stems from the device being marked as "frozen" and never getting "thawed" ...
look at FreezeThaw in dix/events.c
you might want to break in that function when frozen=TRUE (break FreezeThaw if frozen != 0).
It's a small static function and might be inlined by gcc optimizations, so I'd recommend building the server with "-O0 - ggdb3" (which is good measure whenever using gdb any ways).
On Oct 16, 2009, at 15:22, Pelle Johansson wrote:
No problem, I want it fixed as much as anyone. FWIW I've tracked it down (using watch points, of all things. nice to see them finally working) to this backtrace:
#0 0x00000001000dc731 in AddPassiveGrabToList () #1 0x00000001000d020c in ProcGrabButton (client=0x1007df330) at events.c:5176 #2 0x00000001000cbaf4 in Dispatch () #3 0x00000001000ddc41 in dix_main () #4 0x0000000100013f52 in server_thread () #5 0x00007fff86aeaf66 in _pthread_start () #6 0x00007fff86aeae19 in thread_start ()
The passive grab added there is never removed (until the window is unmapped), and it's the one making events queue up when the X server is switched to. The client calling Grab is always the same for the lifetime of the server, the wm maybe?
It is used here: #0 0x00000001000d74b4 in CheckGrabForSyncs (thisDev=<value temporarily unavailable, due to optimizations>, thisMode=<value temporarily unavailable, due to optimizations>, otherMode=0) at events.c:1474 #1 0x00000001000d4331 in CheckPassiveGrabsOnWindow (pWin=<value temporarily unavailable, due to optimizations>, device=0x1007e0a70, xE=0x114452bd0, count=1, store=0x11581cb90, scount=2) at events.c: 3338 #2 0x00000001000d4711 in CheckDeviceGrabs (device=0x1007e0a70, xE=0x11581cb90, checkFirst=0, count=2) at events.c:3445 #3 0x0000000100081b2c in ProcessOtherEvent (xE=0x11581cb90, device=0x1007e0a70, count=2) at exevents.c:1059 #4 0x000000010009fed0 in ProcessPointerEvent () #5 0x00000001000fa0c4 in mieqProcessInputEvents () at mieq.c:476 #6 0x000000010000e965 in ProcessInputEvents () #7 0x00000001000cb70b in Dispatch () #8 0x00000001000ddc41 in dix_main () #9 0x0000000100013f52 in server_thread () #10 0x00007fff86aeaf66 in _pthread_start () #11 0x00007fff86aeae19 in thread_start ()