summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/malloc.h7
-rw-r--r--libc/stdlib/Makefile.in2
-rw-r--r--libc/stdlib/__uc_malloc.c41
3 files changed, 49 insertions, 1 deletions
diff --git a/include/malloc.h b/include/malloc.h
index 354f153d4..05eac9fdd 100644
--- a/include/malloc.h
+++ b/include/malloc.h
@@ -183,6 +183,13 @@ extern int mallopt __MALLOC_P ((int __param, int __val));
#endif /* __MALLOC_STANDARD__ */
+/* uClibc may use malloc internally in situations where user can not be
+ * notified about out-of-memory condition. In this situation uClibc will
+ * call __uc_malloc_failed if it is non-NULL, and retry allocation
+ * if it returns. If __uc_malloc_failed is NULL, uclubc will _exit(1).
+ * NB: do not use stdio in __uc_malloc_failed handler! */
+extern void *__uc_malloc(size_t size);
+extern void (*__uc_malloc_failed)(size_t size);
#ifdef __cplusplus
} /* end of extern "C" */
diff --git a/libc/stdlib/Makefile.in b/libc/stdlib/Makefile.in
index 5a4aafd4f..ad2a95935 100644
--- a/libc/stdlib/Makefile.in
+++ b/libc/stdlib/Makefile.in
@@ -15,7 +15,7 @@ CSRC := \
getpt.c ptsname.c grantpt.c unlockpt.c drand48-iter.c jrand48.c \
jrand48_r.c lrand48.c lrand48_r.c mrand48.c mrand48_r.c nrand48.c \
nrand48_r.c rand_r.c srand48.c srand48_r.c seed48.c seed48_r.c \
- valloc.c posix_memalign.c a64l.c l64a.c
+ valloc.c posix_memalign.c a64l.c l64a.c __uc_malloc.c
ifeq ($(UCLIBC_HAS_ARC4RANDOM),y)
CSRC += arc4random.c
endif
diff --git a/libc/stdlib/__uc_malloc.c b/libc/stdlib/__uc_malloc.c
new file mode 100644
index 000000000..9c8445184
--- /dev/null
+++ b/libc/stdlib/__uc_malloc.c
@@ -0,0 +1,41 @@
+/* vi: set sw=4 ts=4: */
+/* uClibc internal malloc.
+ Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+ The author may be reached (Email) at the address mike@@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+
+void (*__uc_malloc_failed)(size_t size);
+
+void *__uc_malloc(size_t size)
+{
+ void *p;
+
+ while (1) {
+ p = malloc(size);
+ if (!size || p)
+ return p;
+ if (!__uc_malloc_failed)
+ _exit(1);
+ __uc_malloc_failed(size);
+ }
+}