mirror of https://github.com/xqemu/xqemu.git
Monitor patches for 2018-07-31 (3.0.0-rc3)
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJbYIRIAAoJEDhwtADrkYZTOH4P/1DNSUs7Is1Icl5nCmzQ8kOo zozo3u449zJxaPtg63yF1WracR2THhjrsThhpZOUvZXAtmbgCNogZNo50TlfFNfb hanM90eyJR0vzP3iYVsKhuwSFb6XPqcpAVMu6hcRTgWSD58ANdQUT/sOj4wtDIdL r9JuEVUQ/6ddul5CIP7cTfnih7W5RdMMTTYBSdUai9rRP1SoBeGDDPIvrwzG70/D KbGSyuyBhFyNJThzB/jf7fGBZOYNqu6lVUVH7zdy8wHA7NVaZQU/ct4jdkSZAKx0 nz4FHwBqVg72FMWAB0rj7QfNgigg9Y0qPYUBVcjOZxHqYGs4/V0O4HJVkQWb9L7E oBVHlAKGPOzRbwu4086MKtnziF8HFviSBSdtb0vE7ke3vnFK38cx/SPDsMmZGc6a BloPl4UpLaJ/GVbbv7Cg+LS5Bt9vYDg3CtkIw23Gpo79t/Qdl89RUbHWREJmzonW 5FpvPLIy/cnboICfrKQHSlIO4J1BDcDomKHRzbZFEcH3tHKyifx1bmC4vlD9bfJl 6nLJIMfRa49Pvh2hzvTr3u67k9NnFH/6pvMUyRvFI/A/cODbeAul9Z1aLhKbEtBm QDEnW1BqJmg3/XUsaqJ0s8vz4255hthvvNvkm9DVLdQrTvD1yNEWUplVr9TUQAFR 5fw5BKP/SefJDugzxCbk =0oin -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/armbru/tags/pull-monitor-2018-07-31' into staging Monitor patches for 2018-07-31 (3.0.0-rc3) # gpg: Signature made Tue 31 Jul 2018 16:46:16 BST # gpg: using RSA key 3870B400EB918653 # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-monitor-2018-07-31: monitor: temporary fix for dead-lock on event recursion Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
b890416474
44
monitor.c
44
monitor.c
|
@ -633,7 +633,7 @@ static void monitor_qapi_event_handler(void *opaque);
|
||||||
* applying any rate limiting if required.
|
* applying any rate limiting if required.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
|
monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict *qdict)
|
||||||
{
|
{
|
||||||
MonitorQAPIEventConf *evconf;
|
MonitorQAPIEventConf *evconf;
|
||||||
MonitorQAPIEventState *evstate;
|
MonitorQAPIEventState *evstate;
|
||||||
|
@ -688,6 +688,48 @@ monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
|
||||||
qemu_mutex_unlock(&monitor_lock);
|
qemu_mutex_unlock(&monitor_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* monitor_qapi_event_queue_no_reenter() is not reentrant: it
|
||||||
|
* would deadlock on monitor_lock. Work around by queueing
|
||||||
|
* events in thread-local storage.
|
||||||
|
* TODO: remove this, make it re-enter safe.
|
||||||
|
*/
|
||||||
|
typedef struct MonitorQapiEvent {
|
||||||
|
QAPIEvent event;
|
||||||
|
QDict *qdict;
|
||||||
|
QSIMPLEQ_ENTRY(MonitorQapiEvent) entry;
|
||||||
|
} MonitorQapiEvent;
|
||||||
|
static __thread QSIMPLEQ_HEAD(, MonitorQapiEvent) event_queue;
|
||||||
|
static __thread bool reentered;
|
||||||
|
MonitorQapiEvent *ev;
|
||||||
|
|
||||||
|
if (!reentered) {
|
||||||
|
QSIMPLEQ_INIT(&event_queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
ev = g_new(MonitorQapiEvent, 1);
|
||||||
|
ev->qdict = qobject_ref(qdict);
|
||||||
|
ev->event = event;
|
||||||
|
QSIMPLEQ_INSERT_TAIL(&event_queue, ev, entry);
|
||||||
|
if (reentered) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
reentered = true;
|
||||||
|
|
||||||
|
while ((ev = QSIMPLEQ_FIRST(&event_queue)) != NULL) {
|
||||||
|
QSIMPLEQ_REMOVE_HEAD(&event_queue, entry);
|
||||||
|
monitor_qapi_event_queue_no_reenter(ev->event, ev->qdict);
|
||||||
|
qobject_unref(ev->qdict);
|
||||||
|
g_free(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
reentered = false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function runs evconf->rate ns after sending a throttled
|
* This function runs evconf->rate ns after sending a throttled
|
||||||
* event.
|
* event.
|
||||||
|
|
Loading…
Reference in New Issue