Module: wine Branch: stable Commit: d8d8c1a2a759813b289a5444fcbc7cf5039175f8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d8d8c1a2a759813b289a5444fc...
Author: Ken Thomases ken@codeweavers.com Date: Thu Oct 17 23:43:49 2013 -0500
winemac: Clean up fully-delivered events in queues which aren't being drained.
Some events get queued for all GUI-connected threads but are only processed by the first to dequeue them. Other threads which tend their event queue discard such already-processed events. However, some threads may be connected to the GUI but never tend their event queue. To prevent such threads from accumulating zombie events, the zombies are cleared each time a new event is queued.
(cherry picked from commit 761092a2fec5dea6dcbceff5d8dd022f8b1925d3)
---
dlls/winemac.drv/cocoa_event.m | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/winemac.drv/cocoa_event.m b/dlls/winemac.drv/cocoa_event.m index 63cf0e7..621729f 100644 --- a/dlls/winemac.drv/cocoa_event.m +++ b/dlls/winemac.drv/cocoa_event.m @@ -153,10 +153,16 @@ static NSString* const WineEventQueueThreadDictionaryKey = @"WineEventQueueThrea
- (void) postEventObject:(MacDrvEvent*)event { + NSIndexSet* indexes; MacDrvEvent* lastEvent;
[eventsLock lock];
+ indexes = [events indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){ + return ((MacDrvEvent*)obj)->event->deliver <= 0; + }]; + [events removeObjectsAtIndexes:indexes]; + if ((event->event->type == MOUSE_MOVED || event->event->type == MOUSE_MOVED_ABSOLUTE) && event->event->deliver == INT_MAX &&