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).
This commit is contained in:
Peter Hutterer 2008-04-30 17:57:48 +09:30
parent fea39c94bc
commit a0e6a7d4f5
3 changed files with 15 additions and 0 deletions

View File

@ -249,6 +249,7 @@ EnableDevice(DeviceIntPtr dev)
listlen = GetEventList(&evlist);
OsBlockSignals();
SetMinimumEventSize(evlist, listlen, evsize);
mieqResizeEvents(evsize);
OsReleaseSignals();
if ((*prev != dev) || !dev->inited ||

View File

@ -153,6 +153,10 @@ extern Bool mieqInit(
void
);
extern void mieqResize(
int /* min_size */
);
extern void mieqEnqueue(
DeviceIntPtr /*pDev*/,
xEventPtr /*e*/

View File

@ -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