Browse Source

introduce __uc_malloc, so that users can intercept libc internal OOM.

Denis Vlasenko 17 years ago
parent
commit
dc0bc69411
3 changed files with 49 additions and 1 deletions
  1. 7 0
      include/malloc.h
  2. 1 1
      libc/stdlib/Makefile.in
  3. 41 0
      libc/stdlib/__uc_malloc.c

+ 7 - 0
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" */

+ 1 - 1
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

+ 41 - 0
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);
+	}
+}