Signed-off-by: Markus Armbruster <[email protected]>
---
 monitor/monitor.c | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/monitor/monitor.c b/monitor/monitor.c
index 8277f41a9d..87f6e4860b 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -319,17 +319,9 @@ static void monitor_qapi_event_emit(QAPIEvent event, QDict 
*qdict)
     }
 }
 
-static void monitor_qapi_event_handler(void *opaque);
-
-/*
- * Queue a new event for emission to Monitor instances,
- * applying any rate limiting if required.
- */
-static void
-monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict *qdict)
+static int64_t monitor_event_rate_limit(QAPIEvent event, QDict *data)
 {
     MonitorQAPIEventConf *evconf;
-    MonitorQAPIEventState *evstate;
     int64_t rate_limit;
 
     assert(event < QAPI_EVENT__MAX);
@@ -346,13 +338,28 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, 
QDict *qdict)
      * limited, so we can do without rate limiting.
      */
     if (event == QAPI_EVENT_BLOCK_IO_ERROR) {
-        QDict *data = qobject_to(QDict, qdict_get(qdict, "data"));
         const char *action = qdict_get_str(data, "action");
         if (!strcmp(action, "stop")) {
             rate_limit = 0;
         }
     }
 
+    return rate_limit;
+}
+
+static void monitor_qapi_event_handler(void *opaque);
+
+/*
+ * Queue a new event for emission to Monitor instances,
+ * applying any rate limiting if required.
+ */
+static void
+monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict *qdict)
+{
+    QDict *data = qobject_to(QDict, qdict_get(qdict, "data"));
+    int64_t rate_limit = monitor_event_rate_limit(event, data);
+    MonitorQAPIEventState *evstate;
+
     trace_monitor_protocol_event_queue(event, qdict, rate_limit);
 
     QEMU_LOCK_GUARD(&monitor_lock);
@@ -361,7 +368,6 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict 
*qdict)
         /* Unthrottled event */
         monitor_qapi_event_emit(event, qdict);
     } else {
-        QDict *data = qobject_to(QDict, qdict_get(qdict, "data"));
         MonitorQAPIEventState key = { .event = event, .data = data };
 
         evstate = g_hash_table_lookup(monitor_qapi_event_state, &key);
-- 
2.53.0


Reply via email to