On 6/15/2026 12:34 PM, Pierrick Bouvier wrote:
> A coworker recently wrote a C++ plugin, and noticed interesting limitations of
> current API. Basically, the biggest issue is that the only way to maintain
> state
> in a plugin is by using global variables. The root cause is that some
> callback types can't transfer user data.
>
> Also, he asked why some callbacks have a qemu_plugin_id_t, and some other
> don't.
> This excellent question exposed that we don't need this most of the time. And
> if
> needed, we can rely on user data instead.
>
> For functional programmers here, it allows to have something similar to
> continuation-passing style, with all callbacks carrying data to next one.
>
> This series modifies our callback types to make sure they all have a userdata,
> and none have a qemu_plugin_id. Existing C plugins don't need to change, and
> global variables can still exist.
>
> After all those changes, we can finally implement a C++ plugin without any
> static variable (well, out of qemu_plugin_version), using an object and
> lambdas. This act as a demonstration of how we could write future plugins, and
> also, how we are finally on the edge to offer a proper native interface
> in Rust using closures.
>
> v2
> --
> - fix wrong space line removal in patch 7
> - add patch to have consistent documentation for userdata parameter
> - style patch for C++: better commit description and add comments
> about which constructions trigger a false positive
>
> Pierrick Bouvier (26):
> plugins: bump version
> plugins: add userdata for qemu_plugin_{uninstall, reset}
> plugins: add userdata to qemu_plugin_register_flush_cb
> plugins: remove type qemu_plugin_simple_cb_t
> plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t
> plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t
> plugins: add userdata to qemu_plugin_register_vcpu_init_cb
> plugins: add userdata to qemu_plugin_register_vcpu_exit_cb
> plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
> plugins: add userdata to qemu_plugin_register_vcpu_resume_cb
> plugins: add userdata to qemu_plugin_vcpu_for_each
> plugins: remove type qemu_plugin_vcpu_simple_cb_t
> plugins: add userdata to qemu_plugin_register_vcpu_discon_cb
> plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t
> plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t
> plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t
> plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t
> plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb
> plugins: remove qemu_plugin_id from
> qemu_plugin_vcpu_syscall_filter_cb_t
> plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb
> plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t
> plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb
> plugins: use consistent parameter documentation for userdata
> scripts/checkpatch: ignore spaces required around some operators in
> C++
> scripts/checkpatch: remove check on forbidden space before '[' in C++
> plugins/cpp: register callbacks using captureless lambda
>
> contrib/plugins/bbv.c | 10 +--
> contrib/plugins/cache.c | 6 +-
> contrib/plugins/cflow.c | 6 +-
> contrib/plugins/cpp.cpp | 90 ++++++++++++++++++++++-
> contrib/plugins/drcov.c | 6 +-
> contrib/plugins/execlog.c | 10 +--
> contrib/plugins/hotblocks.c | 6 +-
> contrib/plugins/hotpages.c | 6 +-
> contrib/plugins/howvec.c | 6 +-
> contrib/plugins/hwprofile.c | 6 +-
> contrib/plugins/ips.c | 14 ++--
> contrib/plugins/lockstep.c | 18 ++---
> contrib/plugins/stoptrigger.c | 6 +-
> contrib/plugins/traps.c | 9 +--
> contrib/plugins/uftrace.c | 10 +--
> include/plugins/qemu-plugin.h | 132 ++++++++++++++++++----------------
> include/qemu/plugin.h | 2 -
> plugins/api.c | 40 ++++++-----
> plugins/core.c | 93 ++++++++++--------------
> plugins/loader.c | 13 ++--
> plugins/plugin.h | 5 +-
> scripts/checkpatch.pl | 28 +++++++-
> tests/tcg/plugins/bb.c | 10 +--
> tests/tcg/plugins/discons.c | 10 +--
> tests/tcg/plugins/empty.c | 4 +-
> tests/tcg/plugins/inline.c | 6 +-
> tests/tcg/plugins/insn.c | 10 +--
> tests/tcg/plugins/mem.c | 6 +-
> tests/tcg/plugins/patch.c | 4 +-
> tests/tcg/plugins/registers.c | 4 +-
> tests/tcg/plugins/reset.c | 17 ++---
> tests/tcg/plugins/setpc.c | 10 +--
> tests/tcg/plugins/syscall.c | 22 +++---
> 33 files changed, 371 insertions(+), 254 deletions(-)
>
This was merged into master (255745b9ad40df216c0c2334dc0ef4d81f00bc3e).
Regards,
Pierrick