/* * migration yank functions * * 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. */ #include "qemu/osdep.h" #include "qapi/error.h" #include "io/channel.h" #include "yank_functions.h" #include "qemu/yank.h" #include "io/channel-socket.h" #include "io/channel-tls.h" #include "qemu-file.h" void migration_yank_iochannel(void *opaque) { QIOChannel *ioc = QIO_CHANNEL(opaque); qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); } /* Return whether yank is supported on this ioc */ static bool migration_ioc_yank_supported(QIOChannel *ioc) { return object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET) || object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_TLS); } void migration_ioc_register_yank(QIOChannel *ioc) { if (migration_ioc_yank_supported(ioc)) { yank_register_function(MIGRATION_YANK_INSTANCE, migration_yank_iochannel, QIO_CHANNEL(ioc)); } } void migration_ioc_unregister_yank(QIOChannel *ioc) { if (migration_ioc_yank_supported(ioc)) { yank_unregister_function(MIGRATION_YANK_INSTANCE, migration_yank_iochannel, QIO_CHANNEL(ioc)); } } void migration_ioc_unregister_yank_from_file(QEMUFile *file) { QIOChannel *ioc = qemu_file_get_ioc(file); if (ioc) { /* * For migration qemufiles, we'll always reach here. Though we'll skip * calls from e.g. savevm/loadvm as they don't use yank. */ migration_ioc_unregister_yank(ioc); } }