xref: /qemu/migration/yank_functions.c (revision 0a5d1108)
11a92d6d5SLukas Straub /*
21a92d6d5SLukas Straub  * migration yank functions
31a92d6d5SLukas Straub  *
41a92d6d5SLukas Straub  * Copyright (c) Lukas Straub <lukasstraub2@web.de>
51a92d6d5SLukas Straub  *
61a92d6d5SLukas Straub  * This work is licensed under the terms of the GNU GPL, version 2 or later.
71a92d6d5SLukas Straub  * See the COPYING file in the top-level directory.
81a92d6d5SLukas Straub  */
91a92d6d5SLukas Straub 
101a92d6d5SLukas Straub #include "qemu/osdep.h"
111a92d6d5SLukas Straub #include "io/channel.h"
121a92d6d5SLukas Straub #include "yank_functions.h"
1318711405SPeter Xu #include "qemu/yank.h"
1439675fffSPeter Xu #include "qemu-file.h"
151a92d6d5SLukas Straub 
migration_yank_iochannel(void * opaque)161a92d6d5SLukas Straub void migration_yank_iochannel(void *opaque)
171a92d6d5SLukas Straub {
181a92d6d5SLukas Straub     QIOChannel *ioc = QIO_CHANNEL(opaque);
191a92d6d5SLukas Straub 
201a92d6d5SLukas Straub     qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
211a92d6d5SLukas Straub }
2218711405SPeter Xu 
2318711405SPeter Xu /* Return whether yank is supported on this ioc */
migration_ioc_yank_supported(QIOChannel * ioc)2418711405SPeter Xu static bool migration_ioc_yank_supported(QIOChannel *ioc)
2518711405SPeter Xu {
260a5d1108SFabiano Rosas     return qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN);
2718711405SPeter Xu }
2818711405SPeter Xu 
migration_ioc_register_yank(QIOChannel * ioc)2918711405SPeter Xu void migration_ioc_register_yank(QIOChannel *ioc)
3018711405SPeter Xu {
3118711405SPeter Xu     if (migration_ioc_yank_supported(ioc)) {
3218711405SPeter Xu         yank_register_function(MIGRATION_YANK_INSTANCE,
3318711405SPeter Xu                                migration_yank_iochannel,
347d5b0d68SPhilippe Mathieu-Daudé                                ioc);
3518711405SPeter Xu     }
3618711405SPeter Xu }
3718711405SPeter Xu 
migration_ioc_unregister_yank(QIOChannel * ioc)3818711405SPeter Xu void migration_ioc_unregister_yank(QIOChannel *ioc)
3918711405SPeter Xu {
4018711405SPeter Xu     if (migration_ioc_yank_supported(ioc)) {
4118711405SPeter Xu         yank_unregister_function(MIGRATION_YANK_INSTANCE,
4218711405SPeter Xu                                  migration_yank_iochannel,
437d5b0d68SPhilippe Mathieu-Daudé                                  ioc);
4418711405SPeter Xu     }
4518711405SPeter Xu }
4639675fffSPeter Xu 
migration_ioc_unregister_yank_from_file(QEMUFile * file)4739675fffSPeter Xu void migration_ioc_unregister_yank_from_file(QEMUFile *file)
4839675fffSPeter Xu {
4939675fffSPeter Xu     QIOChannel *ioc = qemu_file_get_ioc(file);
5039675fffSPeter Xu 
5139675fffSPeter Xu     if (ioc) {
5239675fffSPeter Xu         /*
5339675fffSPeter Xu          * For migration qemufiles, we'll always reach here.  Though we'll skip
5439675fffSPeter Xu          * calls from e.g. savevm/loadvm as they don't use yank.
5539675fffSPeter Xu          */
5639675fffSPeter Xu         migration_ioc_unregister_yank(ioc);
5739675fffSPeter Xu     }
5839675fffSPeter Xu }
59