>From 41ff718ab6f08a83e81c45e4da6ec5b250680a14 Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Tue, 24 Feb 2009 07:03:40 +0200 Subject: [PATCH FOR REVIEW 1/2] migration: adding set_fd callback to fd-migration The default fd_migrate_set_fd just add the fd to "qemu-big-select". Can be implemented differently for other migration protocols. Signed-off-by: Uri Lublin --- migration-exec.c | 1 + migration-tcp.c | 1 + migration.c | 9 +++++++-- migration.h | 3 +++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/migration-exec.c b/migration-exec.c index 6ed322a..ede63ae 100644 --- a/migration-exec.c +++ b/migration-exec.c @@ -84,6 +84,7 @@ MigrationState *exec_start_outgoing_migration(const char *command, s->close = exec_close; s->get_error = file_errno; s->write = file_write; + s->set_fd = migrate_fd_set_fd; s->mig_state.cancel = migrate_fd_cancel; s->mig_state.get_status = migrate_fd_get_status; s->mig_state.release = migrate_fd_release; diff --git a/migration-tcp.c b/migration-tcp.c index 3f5b104..5772d21 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -93,6 +93,7 @@ MigrationState *tcp_start_outgoing_migration(const char *host_port, s->get_error = socket_errno; s->write = socket_write; s->close = tcp_close; + s->set_fd = migrate_fd_set_fd; s->mig_state.cancel = migrate_fd_cancel; s->mig_state.get_status = migrate_fd_get_status; s->mig_state.release = migrate_fd_release; diff --git a/migration.c b/migration.c index 234dcf6..e4961ea 100644 --- a/migration.c +++ b/migration.c @@ -169,6 +169,11 @@ void migrate_fd_put_notify(void *opaque) qemu_file_put_notify(s->file); } +int migrate_fd_set_fd(FdMigrationState *s) +{ + return qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s); +} + ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size) { FdMigrationState *s = opaque; @@ -176,13 +181,13 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size) do { ret = s->write(s, data, size); - } while (ret == -1 && ((s->get_error(s)) == EINTR || (s->get_error(s)) == EWOULDBLOCK)); + } while (ret == -1 && (s->get_error(s) == EINTR)); if (ret == -1) ret = -(s->get_error(s)); if (ret == -EAGAIN) - qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s); + s->set_fd(s); return ret; } diff --git a/migration.h b/migration.h index ae78792..5c3d5eb 100644 --- a/migration.h +++ b/migration.h @@ -42,6 +42,7 @@ struct FdMigrationState int (*get_error)(struct FdMigrationState*); int (*close)(struct FdMigrationState*); int (*write)(struct FdMigrationState*, const void *, size_t); + int (*set_fd)(struct FdMigrationState*); void *opaque; }; @@ -79,6 +80,8 @@ void migrate_fd_cleanup(FdMigrationState *s); void migrate_fd_put_notify(void *opaque); +int migrate_fd_set_fd(FdMigrationState *s); + ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size); void migrate_fd_connect(FdMigrationState *s); -- 1.6.0.6