summaryrefslogtreecommitdiff
path: root/emulators/qemu-devel/files/patch-block-raw.c
blob: 7d68d282bdaac35f7745fbb0d08c143168cbdfc9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Index: qemu/block-raw.c
@@ -51,7 +51,10 @@
 #include <linux/cdrom.h>
 #include <linux/fd.h>
 #endif
 #ifdef __FreeBSD__
+#include <signal.h>
+#endif
+#if defined(__FreeBSD__) && __FreeBSD__ > 4
 #include <sys/disk.h>
 #endif
 
@@ -167,9 +167,20 @@
 static int aio_sig_num = SIGUSR2;
 static RawAIOCB *first_aio; /* AIO issued */
 static int aio_initialized = 0;
+// FreeBSD 4.x doesn't have sigwait
+#if defined(__FreeBSD__) && __FreeBSD__ <= 4
+static int sigaio_dont = 0;
+#endif
 
 static void aio_signal_handler(int signum)
 {
+// FreeBSD 4.x doesn't have sigwait
+#if defined(__FreeBSD__) && __FreeBSD__ <= 4
+    if (sigaio_dont) {
+	--sigaio_dont;
+	return;
+    }
+#endif
 #ifndef QEMU_TOOL
     CPUState *env = cpu_single_env;
     if (env) {
@@ -284,9 +295,17 @@
     if (qemu_bh_poll())
         return;
 #endif
+// FreeBSD 4.x doesn't have sigwait
+#if defined(__FreeBSD__) && __FreeBSD__ <= 4
+    ++sigaio_dont;
+    do
+	sigsuspend(&wait_oset);
+    while (sigaio_dont);
+#else
     sigemptyset(&set);
     sigaddset(&set, aio_sig_num);
     sigwait(&set, &nb_sigs);
+#endif
     qemu_aio_poll();
 }