mirror of https://gitee.com/openkylin/qemu.git
main-loop: switch POSIX glib integration to GPollFD
Convert glib file descriptor polling from rfds/wfds/xfds to GPollFD. The Windows code still needs poll_fds[] and n_poll_fds but they can now become local variables. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Message-id: 1361356113-11049-4-git-send-email-stefanha@redhat.com Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
cbff4b342b
commit
48ce11ff97
71
main-loop.c
71
main-loop.c
|
@ -145,8 +145,6 @@ int qemu_init_main_loop(void)
|
|||
|
||||
static fd_set rfds, wfds, xfds;
|
||||
static int nfds;
|
||||
static GPollFD poll_fds[1024 * 2]; /* this is probably overkill */
|
||||
static int n_poll_fds;
|
||||
static int max_priority;
|
||||
|
||||
/* Load rfds/wfds/xfds into gpollfds. Will be removed a few commits later. */
|
||||
|
@ -206,65 +204,39 @@ static void gpollfds_to_select(int ret)
|
|||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds,
|
||||
fd_set *xfds, uint32_t *cur_timeout)
|
||||
static int glib_pollfds_idx;
|
||||
static int glib_n_poll_fds;
|
||||
|
||||
static void glib_pollfds_fill(uint32_t *cur_timeout)
|
||||
{
|
||||
GMainContext *context = g_main_context_default();
|
||||
int i;
|
||||
int timeout = 0;
|
||||
int n;
|
||||
|
||||
g_main_context_prepare(context, &max_priority);
|
||||
|
||||
n_poll_fds = g_main_context_query(context, max_priority, &timeout,
|
||||
poll_fds, ARRAY_SIZE(poll_fds));
|
||||
g_assert(n_poll_fds <= ARRAY_SIZE(poll_fds));
|
||||
|
||||
for (i = 0; i < n_poll_fds; i++) {
|
||||
GPollFD *p = &poll_fds[i];
|
||||
|
||||
if ((p->events & G_IO_IN)) {
|
||||
FD_SET(p->fd, rfds);
|
||||
*max_fd = MAX(*max_fd, p->fd);
|
||||
}
|
||||
if ((p->events & G_IO_OUT)) {
|
||||
FD_SET(p->fd, wfds);
|
||||
*max_fd = MAX(*max_fd, p->fd);
|
||||
}
|
||||
if ((p->events & G_IO_ERR)) {
|
||||
FD_SET(p->fd, xfds);
|
||||
*max_fd = MAX(*max_fd, p->fd);
|
||||
}
|
||||
}
|
||||
glib_pollfds_idx = gpollfds->len;
|
||||
n = glib_n_poll_fds;
|
||||
do {
|
||||
GPollFD *pfds;
|
||||
glib_n_poll_fds = n;
|
||||
g_array_set_size(gpollfds, glib_pollfds_idx + glib_n_poll_fds);
|
||||
pfds = &g_array_index(gpollfds, GPollFD, glib_pollfds_idx);
|
||||
n = g_main_context_query(context, max_priority, &timeout, pfds,
|
||||
glib_n_poll_fds);
|
||||
} while (n != glib_n_poll_fds);
|
||||
|
||||
if (timeout >= 0 && timeout < *cur_timeout) {
|
||||
*cur_timeout = timeout;
|
||||
}
|
||||
}
|
||||
|
||||
static void glib_select_poll(fd_set *rfds, fd_set *wfds, fd_set *xfds,
|
||||
bool err)
|
||||
static void glib_pollfds_poll(void)
|
||||
{
|
||||
GMainContext *context = g_main_context_default();
|
||||
GPollFD *pfds = &g_array_index(gpollfds, GPollFD, glib_pollfds_idx);
|
||||
|
||||
if (!err) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_poll_fds; i++) {
|
||||
GPollFD *p = &poll_fds[i];
|
||||
|
||||
if ((p->events & G_IO_IN) && FD_ISSET(p->fd, rfds)) {
|
||||
p->revents |= G_IO_IN;
|
||||
}
|
||||
if ((p->events & G_IO_OUT) && FD_ISSET(p->fd, wfds)) {
|
||||
p->revents |= G_IO_OUT;
|
||||
}
|
||||
if ((p->events & G_IO_ERR) && FD_ISSET(p->fd, xfds)) {
|
||||
p->revents |= G_IO_ERR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_main_context_check(context, max_priority, poll_fds, n_poll_fds)) {
|
||||
if (g_main_context_check(context, max_priority, pfds, glib_n_poll_fds)) {
|
||||
g_main_context_dispatch(context);
|
||||
}
|
||||
}
|
||||
|
@ -273,7 +245,7 @@ static int os_host_main_loop_wait(uint32_t timeout)
|
|||
{
|
||||
int ret;
|
||||
|
||||
glib_select_fill(&nfds, &rfds, &wfds, &xfds, &timeout);
|
||||
glib_pollfds_fill(&timeout);
|
||||
|
||||
if (timeout > 0) {
|
||||
qemu_mutex_unlock_iothread();
|
||||
|
@ -292,7 +264,7 @@ static int os_host_main_loop_wait(uint32_t timeout)
|
|||
qemu_mutex_lock_iothread();
|
||||
}
|
||||
|
||||
glib_select_poll(&rfds, &wfds, &xfds, (ret < 0));
|
||||
glib_pollfds_poll();
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
|
@ -438,8 +410,9 @@ static void pollfds_poll(GArray *pollfds, int nfds, fd_set *rfds,
|
|||
static int os_host_main_loop_wait(uint32_t timeout)
|
||||
{
|
||||
GMainContext *context = g_main_context_default();
|
||||
GPollFD poll_fds[1024 * 2]; /* this is probably overkill */
|
||||
int select_ret = 0;
|
||||
int g_poll_ret, ret, i;
|
||||
int g_poll_ret, ret, i, n_poll_fds;
|
||||
PollingEntry *pe;
|
||||
WaitObjects *w = &wait_objects;
|
||||
gint poll_timeout;
|
||||
|
|
Loading…
Reference in New Issue