* [Qemu-devel] [5525] Live migration for Win32 (Herv?\195?\169 Poussineau)
@ 2008-10-24 21:55 Anthony Liguori
0 siblings, 0 replies; only message in thread
From: Anthony Liguori @ 2008-10-24 21:55 UTC (permalink / raw)
To: qemu-devel
Revision: 5525
http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5525
Author: aliguori
Date: 2008-10-24 21:55:17 +0000 (Fri, 24 Oct 2008)
Log Message:
-----------
Live migration for Win32 (Herv?\195?\169 Poussineau)
This patch fixes migration so that it works on Win32. This requires using
socket specific calls since sockets cannot be treated like file descriptors
on win32.
Signed-off-by: Herv?\195?\169 Poussineau <hpoussin@reactos.org>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Modified Paths:
--------------
trunk/hw/hw.h
trunk/migration-tcp.c
trunk/vl.c
Modified: trunk/hw/hw.h
===================================================================
--- trunk/hw/hw.h 2008-10-24 14:11:41 UTC (rev 5524)
+++ trunk/hw/hw.h 2008-10-24 21:55:17 UTC (rev 5525)
@@ -34,7 +34,7 @@
QEMUFileCloseFunc *close,
QEMUFileRateLimit *rate_limit);
QEMUFile *qemu_fopen(const char *filename, const char *mode);
-QEMUFile *qemu_fopen_fd(int fd);
+QEMUFile *qemu_fopen_socket(int fd);
void qemu_fflush(QEMUFile *f);
int qemu_fclose(QEMUFile *f);
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
Modified: trunk/migration-tcp.c
===================================================================
--- trunk/migration-tcp.c 2008-10-24 14:11:41 UTC (rev 5524)
+++ trunk/migration-tcp.c 2008-10-24 21:55:17 UTC (rev 5525)
@@ -85,10 +85,10 @@
do {
ret = send(s->fd, data, size, 0);
- } while (ret == -1 && errno == EINTR);
+ } while (ret == -1 && (socket_error() == EINTR || socket_error() == EWOULDBLOCK));
if (ret == -1)
- ret = -errno;
+ ret = -socket_error();
if (ret == -EAGAIN)
qemu_set_fd_handler2(s->fd, NULL, NULL, fd_put_notify, s);
@@ -123,7 +123,7 @@
FD_SET(s->fd, &wfds);
ret = select(s->fd + 1, NULL, &wfds, NULL, NULL);
- } while (ret == -1 && errno == EINTR);
+ } while (ret == -1 && socket_error() == EINTR);
}
static void fd_put_ready(void *opaque)
@@ -178,7 +178,7 @@
dprintf("connect completed\n");
do {
ret = getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &val, &valsize);
- } while (ret == -1 && errno == EINTR);
+ } while (ret == -1 && socket_error() == EINTR);
if (ret < 0) {
tcp_error(s);
@@ -273,13 +273,13 @@
do {
ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr));
if (ret == -1)
- ret = -errno;
+ ret = -socket_error();
- if (ret == -EINPROGRESS)
+ if (ret == -EINPROGRESS || ret == -EWOULDBLOCK)
qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s);
} while (ret == -EINTR);
- if (ret < 0 && ret != -EINPROGRESS) {
+ if (ret < 0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK) {
dprintf("connect failed\n");
close(s->fd);
qemu_free(s);
@@ -300,7 +300,7 @@
do {
c = accept(s, (struct sockaddr *)&addr, &addrlen);
- } while (c == -1 && errno == EINTR);
+ } while (c == -1 && socket_error() == EINTR);
dprintf("accepted migration\n");
@@ -309,7 +309,7 @@
return;
}
- f = qemu_fopen_fd(c);
+ f = qemu_fopen_socket(c);
if (f == NULL) {
fprintf(stderr, "could not qemu_fopen socket\n");
goto out;
@@ -349,7 +349,7 @@
s = socket(PF_INET, SOCK_STREAM, 0);
if (s == -1)
- return -errno;
+ return -socket_error();
val = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
@@ -367,5 +367,5 @@
err:
close(s);
- return -errno;
+ return -socket_error();
}
Modified: trunk/vl.c
===================================================================
--- trunk/vl.c 2008-10-24 14:11:41 UTC (rev 5524)
+++ trunk/vl.c 2008-10-24 21:55:17 UTC (rev 5525)
@@ -6252,43 +6252,43 @@
int has_error;
};
-typedef struct QEMUFileFD
+typedef struct QEMUFileSocket
{
int fd;
QEMUFile *file;
-} QEMUFileFD;
+} QEMUFileSocket;
-static int fd_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
+static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
{
- QEMUFileFD *s = opaque;
+ QEMUFileSocket *s = opaque;
ssize_t len;
do {
- len = read(s->fd, buf, size);
- } while (len == -1 && errno == EINTR);
+ len = recv(s->fd, buf, size, 0);
+ } while (len == -1 && socket_error() == EINTR);
if (len == -1)
- len = -errno;
+ len = -socket_error();
return len;
}
-static int fd_close(void *opaque)
+static int socket_close(void *opaque)
{
- QEMUFileFD *s = opaque;
+ QEMUFileSocket *s = opaque;
qemu_free(s);
return 0;
}
-QEMUFile *qemu_fopen_fd(int fd)
+QEMUFile *qemu_fopen_socket(int fd)
{
- QEMUFileFD *s = qemu_mallocz(sizeof(QEMUFileFD));
+ QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
if (s == NULL)
return NULL;
s->fd = fd;
- s->file = qemu_fopen_ops(s, NULL, fd_get_buffer, fd_close, NULL);
+ s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL);
return s->file;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2008-10-24 21:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-24 21:55 [Qemu-devel] [5525] Live migration for Win32 (Herv?\195?\169 Poussineau) Anthony Liguori
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).