diff options
author | Peter Xu <peterx@redhat.com> | 2018-03-06 13:33:18 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2018-03-12 16:12:46 +0100 |
commit | 25679e5d58e258e9950685ffbd0cae4cd40d9cc2 (patch) | |
tree | 6dfb37d5ed74cfac5ec2f6152b8fc1b7a75934cc /chardev | |
parent | 3e7d4d20d3a528b1ed10b1dc3d83119bfb0c5f24 (diff) |
chardev: tcp: postpone async connection setup
This patch allows the socket chardev async connection be setup with
non-default gcontext. We do it by postponing the setup to machine done,
since until then we can know which context we should run the async
operation on.
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Message-Id: <20180306053320.15401-8-peterx@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'chardev')
-rw-r--r-- | chardev/char-socket.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 09aa345869..f6ad6ee4d8 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1005,9 +1005,8 @@ static void qmp_chardev_open_socket(Chardev *chr, s->reconnect_time = reconnect; } - if (s->reconnect_time) { - tcp_chr_connect_async(chr); - } else { + /* If reconnect_time is set, will do that in chr_machine_done. */ + if (!s->reconnect_time) { if (s->is_listen) { char *name; s->listener = qio_net_listener_new(); @@ -1139,6 +1138,17 @@ char_socket_get_connected(Object *obj, Error **errp) return s->connected; } +static int tcp_chr_machine_done_hook(Chardev *chr) +{ + SocketChardev *s = SOCKET_CHARDEV(chr); + + if (s->reconnect_time) { + tcp_chr_connect_async(chr); + } + + return 0; +} + static void char_socket_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); @@ -1154,6 +1164,7 @@ static void char_socket_class_init(ObjectClass *oc, void *data) cc->chr_add_client = tcp_chr_add_client; cc->chr_add_watch = tcp_chr_add_watch; cc->chr_update_read_handler = tcp_chr_update_read_handler; + cc->chr_machine_done = tcp_chr_machine_done_hook; object_class_property_add(oc, "addr", "SocketAddress", char_socket_get_addr, NULL, |