From: "Andreas Färber" <andreas.faerber@web.de>
To: qemu-devel@nongnu.org
Cc: haikuports-devs@ports.haiku-files.org,
"Andreas Färber" <andreas.faerber@web.de>,
"Michael Lotz" <mmlr@mlotz.ch>
Subject: [Qemu-devel] [FYI 7/8] qemu_malloc: Use areas on Haiku for sizes > 1 MiB
Date: Mon, 20 Sep 2010 00:50:49 +0200 [thread overview]
Message-ID: <1284936650-1203-8-git-send-email-andreas.faerber@web.de> (raw)
In-Reply-To: <1284936650-1203-7-git-send-email-andreas.faerber@web.de>
Works around a calloc() SEGV in Haiku's libroot.
Cf. http://dev.haiku-os.org/ticket/6637
Ported to HEAD based on a patch by Michael "mmlr" Lotz.
Also consider the limit when reallocating.
Cc: Michael Lotz <mmlr@mlotz.ch>
---
configure | 1 +
qemu-malloc.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/configure b/configure
index 2ba35a4..3a0d50e 100755
--- a/configure
+++ b/configure
@@ -2354,6 +2354,7 @@ if test "$solaris" = "yes" ; then
fi
if test "$haiku" = "yes" ; then
echo "CONFIG_HAIKU=y" >> $config_host_mak
+ echo "CONFIG_HAIKU_USE_AREAS=y" >> $config_host_mak
fi
if test "$static" = "yes" ; then
echo "CONFIG_STATIC=y" >> $config_host_mak
diff --git a/qemu-malloc.c b/qemu-malloc.c
index ecffb67..ea75a6a 100644
--- a/qemu-malloc.c
+++ b/qemu-malloc.c
@@ -25,6 +25,11 @@
#include "trace.h"
#include <stdlib.h>
+#ifdef CONFIG_HAIKU_USE_AREAS
+#include <OS.h>
+static area_id sHeapArea = 0;
+#endif
+
static void *oom_check(void *ptr)
{
if (ptr == NULL) {
@@ -36,7 +41,18 @@ static void *oom_check(void *ptr)
void qemu_free(void *ptr)
{
trace_qemu_free(ptr);
+#ifdef CONFIG_HAIKU_USE_AREAS
+ if (ptr != NULL) {
+ area_id area = area_for(ptr);
+ if (area == sHeapArea) {
+#endif
free(ptr);
+#ifdef CONFIG_HAIKU_USE_AREAS
+ } else {
+ delete_area(area);
+ }
+ }
+#endif
}
static int allow_zero_malloc(void)
@@ -54,7 +70,23 @@ void *qemu_malloc(size_t size)
if (!size && !allow_zero_malloc()) {
abort();
}
+#ifdef CONFIG_HAIKU_USE_AREAS
+ if (size >= 1024 * 1024) {
+ if (create_area("qemu large alloc area", &ptr, B_ANY_ADDRESS,
+ ((size + B_PAGE_SIZE - 1) / B_PAGE_SIZE) * B_PAGE_SIZE,
+ B_NO_LOCK, B_READ_AREA | B_WRITE_AREA) < B_OK) {
+ ptr = NULL;
+ }
+ ptr = oom_check(ptr);
+ } else {
+#endif
ptr = oom_check(malloc(size ? size : 1));
+#ifdef CONFIG_HAIKU_USE_AREAS
+ if (sHeapArea == 0) {
+ sHeapArea = area_for(ptr);
+ }
+ }
+#endif
trace_qemu_malloc(size, ptr);
return ptr;
}
@@ -65,7 +97,28 @@ void *qemu_realloc(void *ptr, size_t size)
if (!size && !allow_zero_malloc()) {
abort();
}
+#ifdef CONFIG_HAIKU_USE_AREAS
+ area_id area = 0;
+ if (ptr != NULL) {
+ area = area_for(ptr);
+ }
+ if ((area == 0 || area == sHeapArea) && size < 1024 * 1024) {
+#endif
newptr = oom_check(realloc(ptr, size ? size : 1));
+#ifdef CONFIG_HAIKU_USE_AREAS
+ } else if (area == 0 || area == sHeapArea) {
+ free(ptr);
+ newptr = qemu_malloc(size);
+ } else {
+ if (resize_area(area,
+ ((size + B_PAGE_SIZE - 1) / B_PAGE_SIZE) * B_PAGE_SIZE) == B_OK) {
+ newptr = ptr;
+ } else {
+ newptr = NULL;
+ }
+ newptr = oom_check(newptr);
+ }
+#endif
trace_qemu_realloc(ptr, size, newptr);
return newptr;
}
--
1.7.1.rc2.7.g3e7f1
next prev parent reply other threads:[~2010-09-19 22:51 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-18 13:46 [Qemu-devel] Native Port of QEMU to Haiku Michael Lotz
2009-05-19 8:32 ` Stefan Weil
2009-05-19 8:48 ` Avi Kivity
2009-05-19 12:56 ` Anthony Liguori
2009-05-19 13:54 ` François Revol
2009-05-19 16:56 ` Andreas Färber
2009-05-21 1:04 ` Ingo Weinhold
2010-09-19 22:50 ` [Qemu-devel] [PATCH 0/8] Add Haiku host support Andreas Färber
2010-09-19 22:50 ` [Qemu-devel] [PATCH 1/8] configure: Add basic support for Haiku Andreas Färber
2010-09-19 22:50 ` [Qemu-devel] [PATCH 2/8] configure: Don't rely on special pthreads library Andreas Färber
2010-09-19 22:50 ` [Qemu-devel] [PATCH 3/8] Haiku doesn't have libm Andreas Färber
2010-09-19 22:50 ` [Qemu-devel] [PATCH 4/8] nbd: Haiku has _IO() in its BSD compatibility layer Andreas Färber
2010-09-19 22:50 ` [Qemu-devel] [PATCH 5/8] tap: Add stub for Haiku Andreas Färber
2010-09-19 22:50 ` [Qemu-devel] [PATCH 6/8] slirp: Silence warning on Haiku Andreas Färber
2010-09-19 22:50 ` Andreas Färber [this message]
2010-09-19 22:50 ` [Qemu-devel] [FYI 8/8] ui: Haiku frontend Andreas Färber
2010-09-20 12:26 ` [Qemu-devel] Re: [HaikuPorts-devs] [FYI 7/8] qemu_malloc: Use areas on Haiku for sizes > 1 MiB Oliver Tappe
2010-09-21 22:29 ` Andreas Färber
2010-09-20 19:04 ` [Qemu-devel] Re: [HaikuPorts-devs] [PATCH 0/8] Add Haiku host support Ingo Weinhold
2010-09-21 20:54 ` Andreas Färber
2010-10-03 7:47 ` [Qemu-devel] " Blue Swirl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1284936650-1203-8-git-send-email-andreas.faerber@web.de \
--to=andreas.faerber@web.de \
--cc=haikuports-devs@ports.haiku-files.org \
--cc=mmlr@mlotz.ch \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).