At 04/11/2012 06:47 AM, Eric Blake Wrote: > Probably in the noise, but this will let us scale more efficiently > as we recognize ever more qemu events. > > * src/qemu/qemu_monitor_json.c (eventHandlers): Sort. > (eventSearch): New helper function. > (qemuMonitorJSONIOProcessEvent): Optimize event lookup. > --- > > In reply to: > https://www.redhat.com/archives/libvir-list/2012-April/msg00416.html > > src/qemu/qemu_monitor_json.c | 55 +++++++++++++++++++++++------------------ > 1 files changed, 31 insertions(+), 24 deletions(-) > > diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c > index 7c893d4..d142517 100644 > --- a/src/qemu/qemu_monitor_json.c > +++ b/src/qemu/qemu_monitor_json.c > @@ -67,37 +67,45 @@ static void qemuMonitorJSONHandlePMSuspend(qemuMonitorPtr mon, virJSONValuePtr d > static void qemuMonitorJSONHandleBlockJobCompleted(qemuMonitorPtr mon, virJSONValuePtr data); > static void qemuMonitorJSONHandleBlockJobCanceled(qemuMonitorPtr mon, virJSONValuePtr data); > > -static struct { > +typedef struct { > const char *type; > void (*handler)(qemuMonitorPtr mon, virJSONValuePtr data); > -} eventHandlers[] = { > - { "SHUTDOWN", qemuMonitorJSONHandleShutdown, }, > - { "RESET", qemuMonitorJSONHandleReset, }, > +} qemuEventHandler; > +static qemuEventHandler eventHandlers[] = { > + { "BLOCK_IO_ERROR", qemuMonitorJSONHandleIOError, }, > + { "BLOCK_JOB_CANCELLED", qemuMonitorJSONHandleBlockJobCanceled, }, I donot find this event... > + { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJobCompleted, }, > + { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, }, > { "POWERDOWN", qemuMonitorJSONHandlePowerdown, }, > - { "STOP", qemuMonitorJSONHandleStop, }, > + { "RESET", qemuMonitorJSONHandleReset, }, > { "RTC_CHANGE", qemuMonitorJSONHandleRTCChange, }, > - { "WATCHDOG", qemuMonitorJSONHandleWatchdog, }, > - { "BLOCK_IO_ERROR", qemuMonitorJSONHandleIOError, }, > - { "VNC_CONNECTED", qemuMonitorJSONHandleVNCConnect, }, > - { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, }, > - { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, > + { "SHUTDOWN", qemuMonitorJSONHandleShutdown, }, > { "SPICE_CONNECTED", qemuMonitorJSONHandleSPICEConnect, }, > - { "SPICE_INITIALIZED", qemuMonitorJSONHandleSPICEInitialize, }, > { "SPICE_DISCONNECTED", qemuMonitorJSONHandleSPICEDisconnect, }, > - { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, }, > - { "WAKEUP", qemuMonitorJSONHandlePMWakeup, }, > + { "SPICE_INITIALIZED", qemuMonitorJSONHandleSPICEInitialize, }, > + { "STOP", qemuMonitorJSONHandleStop, }, > { "SUSPEND", qemuMonitorJSONHandlePMSuspend, }, > - { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJobCompleted, }, > - { "BLOCK_JOB_CANCELLED", qemuMonitorJSONHandleBlockJobCanceled, }, > + { "VNC_CONNECTED", qemuMonitorJSONHandleVNCConnect, }, > + { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, > + { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, }, > + { "WAKEUP", qemuMonitorJSONHandlePMWakeup, }, > + { "WATCHDOG", qemuMonitorJSONHandleWatchdog, }, > + /* We use bsearch, so keep this list sorted. */ > }; > > +static int > +eventSearch(const void *key, const void *elt) { Hmm, I think eventCompare is better than eventSearch. > + const char *type = key; > + const qemuEventHandler *handler = elt; > + return strcmp(type, handler->type); > +} > > static int > qemuMonitorJSONIOProcessEvent(qemuMonitorPtr mon, > virJSONValuePtr obj) > { > const char *type; > - int i; > + qemuEventHandler *handler; > VIR_DEBUG("mon=%p obj=%p", mon, obj); > > type = virJSONValueObjectGetString(obj, "event"); > @@ -107,14 +115,13 @@ qemuMonitorJSONIOProcessEvent(qemuMonitorPtr mon, > return -1; > } > > - for (i = 0 ; i < ARRAY_CARDINALITY(eventHandlers) ; i++) { > - if (STREQ(eventHandlers[i].type, type)) { > - virJSONValuePtr data = virJSONValueObjectGet(obj, "data"); > - VIR_DEBUG("handle %s handler=%p data=%p", type, > - eventHandlers[i].handler, data); > - (eventHandlers[i].handler)(mon, data); > - break; > - } > + handler = bsearch(type, eventHandlers, ARRAY_CARDINALITY(eventHandlers), > + sizeof(eventHandlers[0]), eventSearch); > + if (handler) { > + virJSONValuePtr data = virJSONValueObjectGet(obj, "data"); > + VIR_DEBUG("handle %s handler=%p data=%p", type, > + handler->handler, data); > + (handler->handler)(mon, data); > } > return 0; > } -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list