summaryrefslogtreecommitdiffstats
path: root/newlib
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2009-04-23 17:54:22 +0000
committerJeff Johnston <jjohnstn@redhat.com>2009-04-23 17:54:22 +0000
commitbbb9d4fde31f44a70a6fb42181dc86cb91791d7e (patch)
tree0b4710c307ae07243760387090df2a799f4e2830 /newlib
parent2beb9fbb02a83e61584e6fa838fd6d75bdd12e4f (diff)
downloadcygnal-bbb9d4fde31f44a70a6fb42181dc86cb91791d7e.tar.gz
cygnal-bbb9d4fde31f44a70a6fb42181dc86cb91791d7e.tar.bz2
cygnal-bbb9d4fde31f44a70a6fb42181dc86cb91791d7e.zip
2009-04-23 Paul Brook <paul@codesourcery.com>
Kazu Hirata <kazu@codesourcery.com> * libc/stdlib/__atexit.c (__register_exitproc): Use weak reference to malloc. Allocate dynamically only if it is present. * libc/stdlib/__call_atexit.c (__call_exitprocs): Use weak reference to free. Call free only if it is present.
Diffstat (limited to 'newlib')
-rw-r--r--newlib/ChangeLog8
-rw-r--r--newlib/libc/stdlib/__atexit.c11
-rw-r--r--newlib/libc/stdlib/__call_atexit.c8
3 files changed, 26 insertions, 1 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 39ab966fb..fce8f2a77 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,11 @@
+2009-04-23 Paul Brook <paul@codesourcery.com>
+ Kazu Hirata <kazu@codesourcery.com>
+
+ * libc/stdlib/__atexit.c (__register_exitproc): Use weak reference
+ to malloc. Allocate dynamically only if it is present.
+ * libc/stdlib/__call_atexit.c (__call_exitprocs): Use weak
+ reference to free. Call free only if it is present.
+
2009-04-22 Anthony Green <green@moxielogic.com>
* configure.host: Add moxie support.
diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c
index 49eebb37e..4f0b67c9e 100644
--- a/newlib/libc/stdlib/__atexit.c
+++ b/newlib/libc/stdlib/__atexit.c
@@ -8,6 +8,8 @@
#include <sys/lock.h>
#include "atexit.h"
+/* Make this a weak reference to avoid pulling in malloc. */
+void * malloc(size_t) _ATTRIBUTE((__weak__));
/*
* Register a function to be performed at exit or on shared library unload.
@@ -38,6 +40,11 @@ _DEFUN (__register_exitproc,
#ifndef _ATEXIT_DYNAMIC_ALLOC
return -1;
#else
+ /* Don't dynamically allocate the atexit array if malloc is not
+ available. */
+ if (!malloc)
+ return -1;
+
p = (struct _atexit *) malloc (sizeof *p);
if (p == NULL)
{
@@ -62,7 +69,9 @@ _DEFUN (__register_exitproc,
args = p->_on_exit_args_ptr;
if (args == NULL)
{
- args = malloc (sizeof * p->_on_exit_args_ptr);
+ if (malloc)
+ args = malloc (sizeof * p->_on_exit_args_ptr);
+
if (args == NULL)
{
#ifndef __SINGLE_THREAD__
diff --git a/newlib/libc/stdlib/__call_atexit.c b/newlib/libc/stdlib/__call_atexit.c
index ab86fcafa..e7f956184 100644
--- a/newlib/libc/stdlib/__call_atexit.c
+++ b/newlib/libc/stdlib/__call_atexit.c
@@ -7,6 +7,9 @@
#include <reent.h>
#include "atexit.h"
+/* Make this a weak reference to avoid pulling in free. */
+void free(void *) _ATTRIBUTE((__weak__));
+
/*
* Call registered exit handlers. If D is null then all handlers are called,
* otherwise only the handlers from that DSO are called.
@@ -76,6 +79,11 @@ _DEFUN (__call_exitprocs, (code, d),
#ifndef _ATEXIT_DYNAMIC_ALLOC
break;
#else
+ /* Don't dynamically free the atexit array if free is not
+ available. */
+ if (!free)
+ break;
+
/* Move to the next block. Free empty blocks except the last one,
which is part of _GLOBAL_REENT. */
if (p->_ind == 0 && p->_next)