Message ID | 20241118221330.3480246-5-peterx@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | QOM: Enforce container_get() to operate on containers only | expand |
diff --git a/hw/core/qdev.c b/hw/core/qdev.c index eff297e584..e828088c58 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -825,7 +825,13 @@ Object *qdev_get_machine(void) static Object *dev; if (dev == NULL) { - dev = container_get(object_get_root(), "/machine"); + /* + * NOTE: when the machine is not yet created, this helper will + * also keep the cached object untouched and return NULL. The next + * invoke of the helper will try to look for the machine again. + * It'll only cache the pointer when it's found the first time. + */ + dev = object_resolve_path_component(object_get_root(), "machine"); } return dev;
Currently, qdev_get_machine() has a slightly misuse of container_get(), as the helper says "get a container" but in reality the goal is to get the machine object. Note that it _may_ get a container (at "/machine") in our current unit test of test-qdev-global-props.c, but it's probably unexpected and worked by accident.. Switch to an explicit object_resolve_path_component(), with a side benefit that qdev_get_machine() can happen a lot, and we don't need to split the string ("/machine") every time. This also paves way for making the helper container_get() never try to return a non-container at all. Signed-off-by: Peter Xu <peterx@redhat.com> --- hw/core/qdev.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)