/* * QEMU yank feature * * Copyright (c) Lukas Straub * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. */ #ifndef YANK_H #define YANK_H #include "qapi/qapi-types-yank.h" typedef void (YankFn)(void *opaque); /** * yank_register_instance: Register a new instance. * * This registers a new instance for yanking. Must be called before any yank * function is registered for this instance. * * This function is thread-safe. * * @instance: The instance. * @errp: Error object. * * Returns true on success or false if an error occurred. */ bool yank_register_instance(const YankInstance *instance, Error **errp); /** * yank_unregister_instance: Unregister a instance. * * This unregisters a instance. Must be called only after every yank function * of the instance has been unregistered. * * This function is thread-safe. * * @instance: The instance. */ void yank_unregister_instance(const YankInstance *instance); /** * yank_register_function: Register a yank function * * This registers a yank function. All limitations of qmp oob commands apply * to the yank function as well. See docs/devel/qapi-code-gen.txt under * "An OOB-capable command handler must satisfy the following conditions". * * This function is thread-safe. * * @instance: The instance. * @func: The yank function. * @opaque: Will be passed to the yank function. */ void yank_register_function(const YankInstance *instance, YankFn *func, void *opaque); /** * yank_unregister_function: Unregister a yank function * * This unregisters a yank function. * * This function is thread-safe. * * @instance: The instance. * @func: func that was passed to yank_register_function. * @opaque: opaque that was passed to yank_register_function. */ void yank_unregister_function(const YankInstance *instance, YankFn *func, void *opaque); #define BLOCKDEV_YANK_INSTANCE(the_node_name) (&(YankInstance) { \ .type = YANK_INSTANCE_TYPE_BLOCK_NODE, \ .u.block_node.node_name = (the_node_name) }) #define CHARDEV_YANK_INSTANCE(the_id) (&(YankInstance) { \ .type = YANK_INSTANCE_TYPE_CHARDEV, \ .u.chardev.id = (the_id) }) #define MIGRATION_YANK_INSTANCE (&(YankInstance) { \ .type = YANK_INSTANCE_TYPE_MIGRATION }) #endif