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:
parent
fea39c94bc
commit
a0e6a7d4f5
|
@ -249,6 +249,7 @@ EnableDevice(DeviceIntPtr dev)
|
||||||
listlen = GetEventList(&evlist);
|
listlen = GetEventList(&evlist);
|
||||||
OsBlockSignals();
|
OsBlockSignals();
|
||||||
SetMinimumEventSize(evlist, listlen, evsize);
|
SetMinimumEventSize(evlist, listlen, evsize);
|
||||||
|
mieqResizeEvents(evsize);
|
||||||
OsReleaseSignals();
|
OsReleaseSignals();
|
||||||
|
|
||||||
if ((*prev != dev) || !dev->inited ||
|
if ((*prev != dev) || !dev->inited ||
|
||||||
|
|
4
mi/mi.h
4
mi/mi.h
|
@ -153,6 +153,10 @@ extern Bool mieqInit(
|
||||||
void
|
void
|
||||||
);
|
);
|
||||||
|
|
||||||
|
extern void mieqResize(
|
||||||
|
int /* min_size */
|
||||||
|
);
|
||||||
|
|
||||||
extern void mieqEnqueue(
|
extern void mieqEnqueue(
|
||||||
DeviceIntPtr /*pDev*/,
|
DeviceIntPtr /*pDev*/,
|
||||||
xEventPtr /*e*/
|
xEventPtr /*e*/
|
||||||
|
|
10
mi/mieq.c
10
mi/mieq.c
|
@ -102,6 +102,16 @@ mieqInit(void)
|
||||||
return TRUE;
|
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
|
* Must be reentrant with ProcessInputEvents. Assumption: mieqEnqueue
|
||||||
* will never be interrupted. If this is called from both signal
|
* will never be interrupted. If this is called from both signal
|
||||||
|
|
Loading…
Reference in New Issue