summaryrefslogtreecommitdiff
path: root/libobjc/memory.c
diff options
context:
space:
mode:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-12 01:44:58 +0000
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-12 01:44:58 +0000
commitbb882a434a451b097294fda228a464f458d2e6ad (patch)
treed3064b97c59138cbba1ca85249d30ede27b9aacf /libobjc/memory.c
parentc3a945cde92094f4713cefdafe5c1bd3f07fbbcc (diff)
downloadgcc-bb882a434a451b097294fda228a464f458d2e6ad.tar.gz
In libobjc/:
* objc/deprecated/objc_malloc.h: New file. * objc/deprecated/objc_valloc.h: New file. * objc/objc-api.h: Include the files instead of defining objc_valloc, _objc_malloc() and similar. * Makefile.in (OBJC_DEPRECATED_H): Added objc_valloc.h and objc_malloc.h. * memory.c: Removed the extra layer of indirection of _objc_malloc and similar. (objc_calloc): Use GC_malloc in the garbage-collected implementation as GC_malloc returns memory that is already freed. (objc_valloc): Deprecated. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164224 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libobjc/memory.c')
-rw-r--r--libobjc/memory.c121
1 files changed, 74 insertions, 47 deletions
diff --git a/libobjc/memory.c b/libobjc/memory.c
index 2cb4dd360d0..2a6dec0de7d 100644
--- a/libobjc/memory.c
+++ b/libobjc/memory.c
@@ -24,6 +24,12 @@ a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
+/*
+ This file includes the standard functions for memory allocation and
+ disposal. Users should use these functions in their ObjC programs
+ so that they work properly with garbage collectors.
+*/
+
#include "objc-private/common.h"
#include "objc-private/error.h"
@@ -38,17 +44,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "objc/objc-api.h"
#include "objc-private/runtime.h"
-/*
- Standard functions for memory allocation and disposal. Users should
- use these functions in their ObjC programs so that they work
- properly with garbage collectors as well as can take advantage of
- the exception/error handling available.
-*/
+#if OBJC_WITH_GC
+#include <gc.h>
void *
objc_malloc (size_t size)
{
- void *res = (void *) (*_objc_malloc) (size);
+ void *res = (void *)(GC_malloc (size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -57,16 +59,53 @@ objc_malloc (size_t size)
void *
objc_atomic_malloc (size_t size)
{
- void *res = (void *) (*_objc_atomic_malloc) (size);
+ void *res = (void *)(GC_malloc_atomic (size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
}
void *
-objc_valloc (size_t size)
+objc_realloc (void *mem, size_t size)
+{
+ void *res = (void *)(GC_realloc (mem, size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
+}
+
+void *
+objc_calloc (size_t nelem, size_t size)
+{
+ /* Note that GC_malloc returns cleared memory (see documentation) so
+ there is no need to clear it. */
+ void *res = (void *)(GC_malloc (nelem, size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
+}
+
+void
+objc_free (void *mem)
+{
+ return;
+}
+
+#else
+
+void *
+objc_malloc (size_t size)
{
- void *res = (void *) (*_objc_valloc) (size);
+ void *res = (void *)(malloc (size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
+}
+
+void *
+objc_atomic_malloc (size_t size)
+{
+ void *res = (void *)(malloc (size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -75,7 +114,7 @@ objc_valloc (size_t size)
void *
objc_realloc (void *mem, size_t size)
{
- void *res = (void *) (*_objc_realloc) (mem, size);
+ void *res = (void *)(realloc (mem, size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -84,7 +123,7 @@ objc_realloc (void *mem, size_t size)
void *
objc_calloc (size_t nelem, size_t size)
{
- void *res = (void *) (*_objc_calloc) (nelem, size);
+ void *res = (void *)(calloc (nelem, size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -93,50 +132,41 @@ objc_calloc (size_t nelem, size_t size)
void
objc_free (void *mem)
{
- (*_objc_free) (mem);
+ free (mem);
}
-/*
- Hook functions for memory allocation and disposal. This makes it
- easy to substitute garbage collection systems such as Boehm's GC by
- assigning these function pointers to the GC's allocation routines.
- By default these point to the ANSI standard malloc, realloc, free,
- etc.
-
- Users should call the normal objc routines above for memory
- allocation and disposal within their programs.
-*/
+#endif /* !OBJC_WITH_GC */
+
+/* The rest of the file contains deprecated code. */
#if OBJC_WITH_GC
-#include <gc.h>
-/* FIXME: The following sounds pointless because the GC_malloc
- documentation says that it returns memory that is already zeroed!
-*/
-static void *
-GC_calloc (size_t nelem, size_t size)
+void *
+objc_valloc (size_t size)
{
- void *p = GC_malloc (nelem * size);
- if (! p)
- _objc_abort ("Virtual memory exhausted!\n");
-
- memset (p, 0, nelem * size);
- return p;
+ void *res = (void *)(GC_malloc (size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
}
-static void
-noFree (void *p)
+#else
+
+void *
+objc_valloc (size_t size)
{
+ void *res = (void *)(malloc (size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
}
-void *(*_objc_malloc) (size_t) = GC_malloc;
-void *(*_objc_atomic_malloc) (size_t) = GC_malloc_atomic;
-void *(*_objc_valloc) (size_t) = GC_malloc;
-void *(*_objc_realloc) (void *, size_t) = GC_realloc;
-void *(*_objc_calloc) (size_t, size_t) = GC_calloc;
-void (*_objc_free) (void *) = noFree;
+#endif /* !OBJC_WITH_GC */
-#else /* !OBJC_WITH_GC */
+/*
+ Hook functions for memory allocation and disposal. Deprecated
+ and currently unused.
+*/
void *(*_objc_malloc) (size_t) = malloc;
void *(*_objc_atomic_malloc) (size_t) = malloc;
@@ -144,6 +174,3 @@ void *(*_objc_valloc) (size_t) = malloc;
void *(*_objc_realloc) (void *, size_t) = realloc;
void *(*_objc_calloc) (size_t, size_t) = calloc;
void (*_objc_free) (void *) = free;
-
-
-#endif /* !OBJC_WITH_GC */