This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
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
Attachment:
signature.asc
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |