mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-26 20:03:54 -06:00
util/main-loop: Introduce the main loop into QOM
'event-loop-base' provides basic property handling for all 'AioContext' based event loops. So let's define a new 'MainLoopClass' that inherits from it. This will permit tweaking the main loop's properties through qapi as well as through the command line using the '-object' keyword[1]. Only one instance of 'MainLoopClass' might be created at any time. 'EventLoopBaseClass' learns a new callback, 'can_be_deleted()' so as to mark 'MainLoop' as non-deletable. [1] For example: -object main-loop,id=main-loop,aio-max-batch=<value> Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Acked-by: Markus Armbruster <armbru@redhat.com> Message-id: 20220425075723.20019-3-nsaenzju@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
7d5983e3c8
commit
70ac26b9e5
6 changed files with 95 additions and 1 deletions
|
@ -33,6 +33,7 @@
|
|||
#include "qemu/error-report.h"
|
||||
#include "qemu/queue.h"
|
||||
#include "qemu/compiler.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <sys/wait.h>
|
||||
|
@ -184,6 +185,61 @@ int qemu_init_main_loop(Error **errp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void main_loop_update_params(EventLoopBase *base, Error **errp)
|
||||
{
|
||||
if (!qemu_aio_context) {
|
||||
error_setg(errp, "qemu aio context not ready");
|
||||
return;
|
||||
}
|
||||
|
||||
aio_context_set_aio_params(qemu_aio_context, base->aio_max_batch, errp);
|
||||
}
|
||||
|
||||
MainLoop *mloop;
|
||||
|
||||
static void main_loop_init(EventLoopBase *base, Error **errp)
|
||||
{
|
||||
MainLoop *m = MAIN_LOOP(base);
|
||||
|
||||
if (mloop) {
|
||||
error_setg(errp, "only one main-loop instance allowed");
|
||||
return;
|
||||
}
|
||||
|
||||
main_loop_update_params(base, errp);
|
||||
|
||||
mloop = m;
|
||||
return;
|
||||
}
|
||||
|
||||
static bool main_loop_can_be_deleted(EventLoopBase *base)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void main_loop_class_init(ObjectClass *oc, void *class_data)
|
||||
{
|
||||
EventLoopBaseClass *bc = EVENT_LOOP_BASE_CLASS(oc);
|
||||
|
||||
bc->init = main_loop_init;
|
||||
bc->update_params = main_loop_update_params;
|
||||
bc->can_be_deleted = main_loop_can_be_deleted;
|
||||
}
|
||||
|
||||
static const TypeInfo main_loop_info = {
|
||||
.name = TYPE_MAIN_LOOP,
|
||||
.parent = TYPE_EVENT_LOOP_BASE,
|
||||
.class_init = main_loop_class_init,
|
||||
.instance_size = sizeof(MainLoop),
|
||||
};
|
||||
|
||||
static void main_loop_register_types(void)
|
||||
{
|
||||
type_register_static(&main_loop_info);
|
||||
}
|
||||
|
||||
type_init(main_loop_register_types)
|
||||
|
||||
static int max_priority;
|
||||
|
||||
#ifndef _WIN32
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue