From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LwiCw-0005FS-JX for qemu-devel@nongnu.org; Wed, 22 Apr 2009 15:34:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LwiCr-0005De-FU for qemu-devel@nongnu.org; Wed, 22 Apr 2009 15:34:09 -0400 Received: from [199.232.76.173] (port=44676 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LwiCq-0005DF-IN for qemu-devel@nongnu.org; Wed, 22 Apr 2009 15:34:04 -0400 Received: from mx2.redhat.com ([66.187.237.31]:37806) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LwiCp-0000it-HC for qemu-devel@nongnu.org; Wed, 22 Apr 2009 15:34:03 -0400 Message-Id: <20090422192119.869018048@localhost.localdomain> References: <20090422191504.975476933@localhost.localdomain> Date: Wed, 22 Apr 2009 16:15:09 -0300 From: mtosatti@redhat.com Content-Disposition: inline; filename=move-to-generic-m-l-b Subject: [Qemu-devel] [patch 05/14] qemu: factor out special event notification List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, aliguori@us.ibm.com Cc: Marcelo Tosatti Special events that have no particular event descriptor (either fd for UNIX or HANDLE for Windows) associated with make use of an artificial one. Signed-off-by: Marcelo Tosatti Index: trunk/vl.c =================================================================== --- trunk.orig/vl.c +++ trunk/vl.c @@ -921,15 +921,11 @@ static void qemu_rearm_alarm_timer(struc #define MIN_TIMER_REARM_US 250 static struct qemu_alarm_timer *alarm_timer; -#ifndef _WIN32 -static int alarm_timer_rfd, alarm_timer_wfd; -#endif #ifdef _WIN32 struct qemu_alarm_win32 { MMRESULT timerId; - HANDLE host_alarm; unsigned int period; } alarm_win32_data = {0, NULL, -1}; @@ -1343,10 +1339,6 @@ static void host_alarm_handler(int host_ qemu_get_clock(rt_clock))) { CPUState *env = next_cpu; -#ifdef _WIN32 - struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv; - SetEvent(data->host_alarm); -#endif alarm_timer->flags |= ALARM_FLAG_EXPIRED; if (env) { @@ -1638,9 +1630,6 @@ static void unix_stop_timer(struct qemu_ #ifdef _WIN32 -static void dummy_event_handler(void *opaque) -{ -} static int win32_start_timer(struct qemu_alarm_timer *t) { @@ -1648,12 +1637,6 @@ static int win32_start_timer(struct qemu struct qemu_alarm_win32 *data = t->priv; UINT flags; - data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL); - if (!data->host_alarm) { - perror("Failed CreateEvent"); - return -1; - } - memset(&tc, 0, sizeof(tc)); timeGetDevCaps(&tc, sizeof(tc)); @@ -1682,8 +1665,6 @@ static int win32_start_timer(struct qemu return -1; } - qemu_add_wait_object(data->host_alarm, dummy_event_handler, t); - return 0; } @@ -1733,25 +1714,6 @@ static int init_timer_alarm(void) struct qemu_alarm_timer *t = NULL; int i, err = -1; -#ifndef _WIN32 - int fds[2]; - - err = pipe(fds); - if (err == -1) - return -errno; - - err = fcntl_setfl(fds[0], O_NONBLOCK); - if (err < 0) - goto fail; - - err = fcntl_setfl(fds[1], O_NONBLOCK); - if (err < 0) - goto fail; - - alarm_timer_rfd = fds[0]; - alarm_timer_wfd = fds[1]; -#endif - for (i = 0; alarm_timers[i].name; i++) { t = &alarm_timers[i]; @@ -1770,10 +1732,6 @@ static int init_timer_alarm(void) return 0; fail: -#ifndef _WIN32 - close(fds[0]); - close(fds[1]); -#endif return err; } @@ -3629,6 +3587,82 @@ void qemu_notify_event(void) } } +#ifdef CONFIG_IOTHREAD +#ifndef _WIN32 +static int io_thread_fd = -1; + +static void qemu_event_increment(void) +{ + static const char byte = 0; + + if (io_thread_fd == -1) + return; + + write(io_thread_fd, &byte, sizeof(byte)); +} + +static void qemu_event_read(void *opaque) +{ + int fd = (unsigned long)opaque; + ssize_t len; + + /* Drain the notify pipe */ + do { + char buffer[512]; + len = read(fd, buffer, sizeof(buffer)); + } while ((len == -1 && errno == EINTR) || len > 0); +} + +static int qemu_event_init(void) +{ + int err; + int fds[2]; + + err = pipe(fds); + if (err == -1) + return -errno; + + err = fcntl_setfl(fds[0], O_NONBLOCK); + if (err < 0) + goto fail; + + err = fcntl_setfl(fds[1], O_NONBLOCK); + if (err < 0) + goto fail; + + qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL, + (void *)(unsigned long)fds[0]); + + io_thread_fd = fds[1]; +fail: + close(fds[0]); + close(fds[1]); + return err; +} +#else +HANDLE qemu_event_handle; + +static void dummy_event_handler(void *opaque) +{ +} + +static int qemu_event_init(void) +{ + qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!qemu_event_handle) { + perror("Failed CreateEvent"); + return -1; + } + qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL); +} + +static void qemu_event_increment(void) +{ + SetEvent(qemu_event_handle); +} +#endif +#endif + #ifdef _WIN32 static void host_main_loop_wait(int *timeout) { --