summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2008-04-30 17:57:48 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2008-04-30 17:57:48 +0930
commita0e6a7d4f507c5c0a0b11adb10394af58a0a6e07 (patch)
tree7e439f054087de4e929839571e923dcb1a7b0c46
parentfea39c94bcc8b635d37530d8a27ee92acab484fe (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.c1
-rw-r--r--mi/mi.h4
-rw-r--r--mi/mieq.c10
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 ||
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