From a0e6a7d4f507c5c0a0b11adb10394af58a0a6e07 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 30 Apr 2008 17:57:48 +0930 Subject: [PATCH] dix: resize EQ to minimum size to avoid reallocs during SIGIO. When a new device is added, calculate the event size needed if a DCCE event is sent and set the EQ's event size to this minimum. This avoids reallocs when a event is sent (which may happen during a SIGIO). --- dix/devices.c | 1 + mi/mi.h | 4 ++++ mi/mieq.c | 10 ++++++++++ 3 files changed, 15 insertions(+) diff --git a/dix/devices.c b/dix/devices.c index abd3cb6d2..802bf79d0 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -249,6 +249,7 @@ EnableDevice(DeviceIntPtr dev) listlen = GetEventList(&evlist); OsBlockSignals(); SetMinimumEventSize(evlist, listlen, evsize); + mieqResizeEvents(evsize); OsReleaseSignals(); if ((*prev != dev) || !dev->inited || diff --git a/mi/mi.h b/mi/mi.h index 842edf319..0af1a1bd3 100644 --- a/mi/mi.h +++ b/mi/mi.h @@ -153,6 +153,10 @@ extern Bool mieqInit( void ); +extern void mieqResize( + int /* min_size */ +); + extern void mieqEnqueue( DeviceIntPtr /*pDev*/, xEventPtr /*e*/ diff --git a/mi/mieq.c b/mi/mieq.c index 9f818677b..3ab893650 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -102,6 +102,16 @@ mieqInit(void) return TRUE; } +/* Ensure all events in the EQ are at least size bytes. */ +Bool +mieqResizeEvents(int min_size) +{ + int i; + + for (i = 0; i < QUEUE_SIZE; i++) + SetMinimumEventSize(miEventQueue.events[i].events, 7, min_size); +} + /* * Must be reentrant with ProcessInputEvents. Assumption: mieqEnqueue * will never be interrupted. If this is called from both signal