qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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

  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).