aboutsummaryrefslogtreecommitdiff
path: root/newlib
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2002-04-13 10:27:02 +0000
committerAlexandre Oliva <aoliva@redhat.com>2002-04-13 10:27:02 +0000
commit2f3009bd13d43a6d9894a21e5c3bd6f7eac125ac (patch)
tree15c2c1c212a439bbcda315cf70dd1e0515a32a99 /newlib
parent0cc261b11d5074e10f728381e9b25cf8c9ed4fa9 (diff)
downloadnewlib-2f3009bd13d43a6d9894a21e5c3bd6f7eac125ac.zip
newlib-2f3009bd13d43a6d9894a21e5c3bd6f7eac125ac.tar.gz
newlib-2f3009bd13d43a6d9894a21e5c3bd6f7eac125ac.tar.bz2
* libc/stdlib/mallocr.c (malloc_extend_top): If correction sbrk
fails, don't bail out, and try to correct next time.
Diffstat (limited to 'newlib')
-rw-r--r--newlib/ChangeLog3
-rw-r--r--newlib/libc/stdlib/mallocr.c17
2 files changed, 16 insertions, 4 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 0546001..b3ea383 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,5 +1,8 @@
2002-04-13 Alexandre Oliva <aoliva@redhat.com>
+ * libc/stdlib/mallocr.c (malloc_extend_top): If correction sbrk
+ fails, don't bail out, and try to correct next time.
+
* libc/include/sys/config.h: Include limits.h.
2002-04-12 Eric Norum <eric.norum@usask.com>
diff --git a/newlib/libc/stdlib/mallocr.c b/newlib/libc/stdlib/mallocr.c
index 1e7120a..9137005 100644
--- a/newlib/libc/stdlib/mallocr.c
+++ b/newlib/libc/stdlib/mallocr.c
@@ -2128,6 +2128,7 @@ static void malloc_extend_top(RARG nb) RDECL INTERNAL_SIZE_T nb;
char* brk; /* return value from sbrk */
INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of sbrked space */
INTERNAL_SIZE_T correction; /* bytes for 2nd sbrk call */
+ int correction_failed = 0; /* whether we should relax the assertion */
char* new_brk; /* return of 2nd sbrk call */
INTERNAL_SIZE_T top_size; /* new size of top chunk */
@@ -2152,11 +2153,13 @@ static void malloc_extend_top(RARG nb) RDECL INTERNAL_SIZE_T nb;
/* Fail if sbrk failed or if a foreign sbrk call killed our space */
if (brk == (char*)(MORECORE_FAILURE) ||
(brk < old_end && old_top != initial_top))
- return;
+ return;
sbrked_mem += sbrk_size;
- if (brk == old_end) /* can just add bytes to current top */
+ if (brk == old_end /* can just add bytes to current top, unless
+ previous correction failed */
+ && ((POINTER_UINT)old_end & (pagesz - 1)) == 0)
{
top_size = sbrk_size + old_top_size;
set_head(top, top_size | PREV_INUSE);
@@ -2183,7 +2186,12 @@ static void malloc_extend_top(RARG nb) RDECL INTERNAL_SIZE_T nb;
/* Allocate correction */
new_brk = (char*)(MORECORE (correction));
- if (new_brk == (char*)(MORECORE_FAILURE)) return;
+ if (new_brk == (char*)(MORECORE_FAILURE))
+ {
+ correction = 0;
+ correction_failed = 1;
+ new_brk = brk;
+ }
sbrked_mem += correction;
@@ -2228,7 +2236,8 @@ static void malloc_extend_top(RARG nb) RDECL INTERNAL_SIZE_T nb;
#endif
/* We always land on a page boundary */
- assert(((unsigned long)((char*)top + top_size) & (pagesz - 1)) == 0);
+ assert(((unsigned long)((char*)top + top_size) & (pagesz - 1)) == 0
+ || correction_failed);
}
#endif /* DEFINE_MALLOC */