summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/stdlib.h1
-rw-r--r--src/lib/stdlib.C28
2 files changed, 29 insertions, 0 deletions
diff --git a/src/include/stdlib.h b/src/include/stdlib.h
index 46c463119..69afb84a4 100644
--- a/src/include/stdlib.h
+++ b/src/include/stdlib.h
@@ -10,6 +10,7 @@ extern "C"
void* malloc(size_t);
void free(void*);
+void* realloc(void*, size_t);
#ifdef __cplusplus
};
diff --git a/src/lib/stdlib.C b/src/lib/stdlib.C
index 5bf0d87f6..8aa6b36eb 100644
--- a/src/lib/stdlib.C
+++ b/src/lib/stdlib.C
@@ -1,4 +1,5 @@
#include <stdlib.h>
+#include <string.h>
#include <kernel/heapmgr.H>
#include <kernel/pagemgr.H>
@@ -33,3 +34,30 @@ void free(void* p)
HeapManager::free(p);
}
}
+
+void* realloc(void* p, size_t s)
+{
+ if (NULL == p) return malloc(s);
+
+ size_t* len = (size_t*)p;
+ len--;
+
+ size_t cur_size;
+ if ((*len) > 0xff)
+ {
+ cur_size = ((*len) >> 8) * PageManager::PAGESIZE - 8;
+ }
+ else
+ {
+ cur_size = (1 << (*len + 4)) - 8;
+ }
+
+ if (s < cur_size)
+ return p;
+
+ void* new_p = malloc(s);
+ memcpy(new_p, p, cur_size);
+ free(p);
+
+ return new_p;
+}
OpenPOWER on IntegriCloud