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>
This commit is contained in:
parent
3e7d4d20d3
commit
25679e5d58
@ -1005,9 +1005,8 @@ static void qmp_chardev_open_socket(Chardev *chr,
|
|||||||
s->reconnect_time = reconnect;
|
s->reconnect_time = reconnect;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->reconnect_time) {
|
/* If reconnect_time is set, will do that in chr_machine_done. */
|
||||||
tcp_chr_connect_async(chr);
|
if (!s->reconnect_time) {
|
||||||
} else {
|
|
||||||
if (s->is_listen) {
|
if (s->is_listen) {
|
||||||
char *name;
|
char *name;
|
||||||
s->listener = qio_net_listener_new();
|
s->listener = qio_net_listener_new();
|
||||||
@ -1139,6 +1138,17 @@ char_socket_get_connected(Object *obj, Error **errp)
|
|||||||
return s->connected;
|
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)
|
static void char_socket_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
ChardevClass *cc = CHARDEV_CLASS(oc);
|
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_client = tcp_chr_add_client;
|
||||||
cc->chr_add_watch = tcp_chr_add_watch;
|
cc->chr_add_watch = tcp_chr_add_watch;
|
||||||
cc->chr_update_read_handler = tcp_chr_update_read_handler;
|
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",
|
object_class_property_add(oc, "addr", "SocketAddress",
|
||||||
char_socket_get_addr, NULL,
|
char_socket_get_addr, NULL,
|
||||||
|
Loading…
Reference in New Issue
Block a user