diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-04-30 17:57:48 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-04-30 17:57:48 +0930 |
commit | a0e6a7d4f507c5c0a0b11adb10394af58a0a6e07 (patch) | |
tree | 7e439f054087de4e929839571e923dcb1a7b0c46 | |
parent | fea39c94bcc8b635d37530d8a27ee92acab484fe (diff) |
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).
-rw-r--r-- | dix/devices.c | 1 | ||||
-rw-r--r-- | mi/mi.h | 4 | ||||
-rw-r--r-- | mi/mieq.c | 10 |
3 files changed, 15 insertions, 0 deletions
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 || @@ -153,6 +153,10 @@ extern Bool mieqInit( void ); +extern void mieqResize( + int /* min_size */ +); + extern void mieqEnqueue( DeviceIntPtr /*pDev*/, xEventPtr /*e*/ @@ -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 |