Skip to content

Commit

Permalink
char: remove the right fd been watched in qemu_chr_fe_set_handlers()
Browse files Browse the repository at this point in the history
We can call qemu_chr_fe_set_handlers() to add/remove fd been watched
in 'context' which can be either default main context or other explicit
context. But the original logic is not correct, we didn't remove
the right fd because we call g_main_context_find_source_by_id(NULL, tag)
which always try to find the Gsource from default context.

Fix it by passing the right context to g_main_context_find_source_by_id().

Cc: Paolo Bonzini <[email protected]>
Cc: Marc-André Lureau <[email protected]>
Signed-off-by: zhanghailiang <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
Signed-off-by: Jason Wang <[email protected]>
  • Loading branch information
colo-ft authored and jasowang committed Mar 6, 2017
1 parent dfd917a commit 8487ce4
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 15 deletions.
6 changes: 3 additions & 3 deletions chardev/char-fd.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ static gboolean fd_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
ret = qio_channel_read(
chan, (gchar *)buf, len, NULL);
if (ret == 0) {
remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
return FALSE;
}
Expand Down Expand Up @@ -89,7 +89,7 @@ static void fd_chr_update_read_handler(Chardev *chr,
{
FDChardev *s = FD_CHARDEV(chr);

remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
if (s->ioc_in) {
chr->fd_in_tag = io_add_watch_poll(chr, s->ioc_in,
fd_chr_read_poll,
Expand All @@ -103,7 +103,7 @@ static void char_fd_finalize(Object *obj)
Chardev *chr = CHARDEV(obj);
FDChardev *s = FD_CHARDEV(obj);

remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
if (s->ioc_in) {
object_unref(OBJECT(s->ioc_in));
}
Expand Down
8 changes: 4 additions & 4 deletions chardev/char-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,14 +127,14 @@ guint io_add_watch_poll(Chardev *chr,
return tag;
}

static void io_remove_watch_poll(guint tag)
static void io_remove_watch_poll(guint tag, GMainContext *context)
{
GSource *source;
IOWatchPoll *iwp;

g_return_if_fail(tag > 0);

source = g_main_context_find_source_by_id(NULL, tag);
source = g_main_context_find_source_by_id(context, tag);
g_return_if_fail(source != NULL);

iwp = io_watch_poll_from_source(source);
Expand All @@ -146,10 +146,10 @@ static void io_remove_watch_poll(guint tag)
g_source_destroy(&iwp->parent);
}

void remove_fd_in_watch(Chardev *chr)
void remove_fd_in_watch(Chardev *chr, GMainContext *context)
{
if (chr->fd_in_tag) {
io_remove_watch_poll(chr->fd_in_tag);
io_remove_watch_poll(chr->fd_in_tag, context);
chr->fd_in_tag = 0;
}
}
Expand Down
2 changes: 1 addition & 1 deletion chardev/char-io.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ guint io_add_watch_poll(Chardev *chr,
gpointer user_data,
GMainContext *context);

void remove_fd_in_watch(Chardev *chr);
void remove_fd_in_watch(Chardev *chr, GMainContext *context);

int io_channel_send(QIOChannel *ioc, const void *buf, size_t len);

Expand Down
2 changes: 1 addition & 1 deletion chardev/char-pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ static void pty_chr_state(Chardev *chr, int connected)
g_source_remove(s->open_tag);
s->open_tag = 0;
}
remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
s->connected = 0;
/* (re-)connect poll interval for idle guests: once per second.
* We check more frequently in case the guests sends data to
Expand Down
4 changes: 2 additions & 2 deletions chardev/char-socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ static void tcp_chr_free_connection(Chardev *chr)
}

tcp_set_msgfds(chr, NULL, 0);
remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
object_unref(OBJECT(s->sioc));
s->sioc = NULL;
object_unref(OBJECT(s->ioc));
Expand Down Expand Up @@ -498,7 +498,7 @@ static void tcp_chr_update_read_handler(Chardev *chr,
return;
}

remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
if (s->ioc) {
chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
tcp_chr_read_poll,
Expand Down
6 changes: 3 additions & 3 deletions chardev/char-udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ static gboolean udp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
ret = qio_channel_read(
s->ioc, (char *)s->buf, sizeof(s->buf), NULL);
if (ret <= 0) {
remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
return FALSE;
}
s->bufcnt = ret;
Expand All @@ -101,7 +101,7 @@ static void udp_chr_update_read_handler(Chardev *chr,
{
UdpChardev *s = UDP_CHARDEV(chr);

remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
if (s->ioc) {
chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
udp_chr_read_poll,
Expand All @@ -115,7 +115,7 @@ static void char_udp_finalize(Object *obj)
Chardev *chr = CHARDEV(obj);
UdpChardev *s = UDP_CHARDEV(obj);

remove_fd_in_watch(chr);
remove_fd_in_watch(chr, NULL);
if (s->ioc) {
object_unref(OBJECT(s->ioc));
}
Expand Down
2 changes: 1 addition & 1 deletion chardev/char.c
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
cc = CHARDEV_GET_CLASS(s);
if (!opaque && !fd_can_read && !fd_read && !fd_event) {
fe_open = 0;
remove_fd_in_watch(s);
remove_fd_in_watch(s, context);
} else {
fe_open = 1;
}
Expand Down

0 comments on commit 8487ce4

Please sign in to comment.