[PATCH] malloc on top to consider already available memory
Corinna Vinschen
vinschen@redhat.com
Mon Feb 15 13:44:00 GMT 2016
Hi Petter, hi guys,
On Feb 12 16:23, Petter Österlund wrote:
>
> Hi,
>
> This is my fist post. I suggest a patch for malloc considering already
> available memory available on the top instead of always extending top
> with the allocation request size when there is not enough space, which may
> cause near double memory requirements in some cases. For an MCU with
> small memory it may be quite crucial and for anyone it is a bit unexpected
> behavior.
>
> An example of the problem; Do malloc(30000); free(); malloc(40000);
> free(); then without this patch then peak memory will become 70KB
> but with the patch it will be only 40KB as second extend will only be
> for 10KB extra not 40K.
>
> Newer versions of Doug Lea malloc, starting with version 2.7.0,
> already contains similar fix since several years ago and it would be
> nice if this fix could be included in Newlib also.
Can you point to this patch?
> The patch below first try and extend top with the diff of what should
> be needed, if that fails to extend top large enough for some reason
> the behavior falls back on old behavior (a failure may happen if there
> are intervening sbrk() or if out of memory).
>
> br Petter
>
> $ diff -up newlib-2.3.0.20160104/newlib/libc/stdlib/mallocr.c
> newlib-patch/newlib/libc/stdlib/mallocr.c
> --- newlib-2.3.0.20160104/newlib/libc/stdlib/mallocr.c 2016-02-12
> 15:32:05.380345800 +0100
> +++ newlib-patch/newlib/libc/stdlib/mallocr.c 2016-02-12
> 15:36:17.184029400 +0100
> @@ -2572,7 +2572,20 @@ Void_t* mALLOc(RARG bytes) RDECL size_t
> #endif
>
> /* Try to extend */
> - malloc_extend_top(RCALL nb);
> + if (bytes > chunksize(top)) {
> + /* extend including whats available on top */
> + INTERNAL_SIZE_T nb_diff = request2size(long_sub_size_t(bytes,
> chunksize(top)));
> + malloc_extend_top(RCALL nb_diff);
> + remainder_size = long_sub_size_t(chunksize(top), nb);
> + if (chunksize(top) < nb || remainder_size < (long)MINSIZE)
> + {
> + /* top not large enough; failure or intervening sbrk() */
> + malloc_trim(RCALL 0);
> + malloc_extend_top(RCALL nb);
> + }
> + }
> + else
> + malloc_extend_top(RCALL nb);
> remainder_size = long_sub_size_t(chunksize(top), nb);
> if (chunksize(top) < nb || remainder_size < (long)MINSIZE)
> {
Can anybody here using the newlib malloc give this a whirl? Cygwin
is using its own malloc, so I can't test this easily.
Thanks,
Corinna
--
Corinna Vinschen
Cygwin Maintainer
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20160215/33dbf82a/attachment.sig>
More information about the Newlib
mailing list