[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [patch 05/14] qemu: factor out special event notification
From: |
mtosatti |
Subject: |
[Qemu-devel] [patch 05/14] qemu: factor out special event notification |
Date: |
Wed, 22 Apr 2009 16:15:09 -0300 |
User-agent: |
quilt/0.46-1 |
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 <address@hidden>
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)
{
--
- [Qemu-devel] Re: [patch 11/11] qemu: basic kvm iothread support, Anthony Liguori, 2009/04/17
- [Qemu-devel] [patch 00/14] qemu: introduce iothread (v4), mtosatti, 2009/04/22
- [Qemu-devel] [patch 11/14] qemu: use debug_requested global instead of cpu_exec return, mtosatti, 2009/04/22
- [Qemu-devel] [patch 05/14] qemu: factor out special event notification,
mtosatti <=
- [Qemu-devel] [patch 08/14] qemu: introduce qemu_cpu_kick, mtosatti, 2009/04/22
- [Qemu-devel] [patch 07/14] qemu: introduce qemu_init_vcpu, mtosatti, 2009/04/22
- [Qemu-devel] [patch 14/14] qemu: introduce iothread, mtosatti, 2009/04/22
- [Qemu-devel] [patch 13/14] qemu: handle stop request in main loop, mtosatti, 2009/04/22
- [Qemu-devel] [patch 04/14] qemu: explictly rearm alarm timer on main_loop_wait, mtosatti, 2009/04/22
- [Qemu-devel] [patch 12/14] qemu: refactor tcg cpu execution loop, mtosatti, 2009/04/22
- [Qemu-devel] [patch 09/14] qemu: introduce qemu_init_main_loop, mtosatti, 2009/04/22
- [Qemu-devel] [patch 06/14] qemu: refactor main_loop, mtosatti, 2009/04/22
- [Qemu-devel] [patch 10/14] qemu: introduce lock/unlock_iothread, mtosatti, 2009/04/22