Tidyups for garbage collection

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@4952 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 1999-09-28 10:25:42 +00:00
parent 0294d782e8
commit c315156563
6 changed files with 57 additions and 58 deletions

View file

@ -1,4 +1,4 @@
Tue Sep 28 9:54:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
Tue Sep 28 11:45:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSArray.m: ([+allocWithZone:]) tiny optimisation.
* Source/NSCountedSet.m: Some optimisation.
@ -9,6 +9,11 @@ Tue Sep 28 9:54:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
([-volatileDomainForName:]) return constant dictionary.
([-setPersistentDomain:forName:]) make mutable copy.
([-setVolatileDomain:forName:]) ditto
* Source/NSObject.m: GC tweaks
* Source/NSZone.m: added zone for atomic GC
* Headers/Foundation/NSZone.h: added zone GSAtomicMallocZone()
* Headers/Foundation/GSIArray.h: Remove special case for zero zone
* Headers/Foundation/GSIMap.h: ditto.
Tue Sep 28 5:54:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>

View file

@ -428,17 +428,7 @@ GSIArrayInitWithZoneAndCapacity(GSIArray array, NSZone *zone, size_t capacity)
array->cap = capacity;
array->old = capacity/2;
size = capacity*sizeof(GSIArrayItem);
#if GS_WITH_GC
/*
* If we use a nil zone, objects we point to are subject to GC
*/
if (zone == 0)
array->ptr = (GSIArrayItem*)GC_MALLOC_ATOMIC(size);
else
array->ptr = (GSIArrayitem)GC_MALLOC(zone, size);
#else
array->ptr = (GSIArrayItem*)NSZoneMalloc(zone, size);
#endif
return array;
}

View file

@ -364,17 +364,7 @@ GSIMapMoreNodes(GSIMapTable map)
chunkCount = ((map->nodeCount>>2)+1)<<1;
}
chunkSize = chunkCount * sizeof(GSIMapNode_t);
#if GS_WITH_GC
/*
* If we use a nil zone, objects we point to are subject to GC
*/
if (map->zone == 0)
newNodes = (GSIMapNode*)GC_MALLOC_ATOMIC(chunkSize);
else
newNodes = (GSIMapNode*)GC_MALLOC(chunkSize);
#else
newNodes = (GSIMapNode)NSZoneMalloc(map->zone, chunkSize);
#endif
if (newNodes)
{
map->nodeChunks[map->chunkCount++] = newNodes;

View file

@ -1,5 +1,5 @@
/* Zone memory management. -*- Mode: ObjC -*-
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
Written by: Yoo C. Chung <wacko@laplace.snu.ac.kr>
Date: January 1997
@ -69,6 +69,8 @@ extern NSZone* __nszone_private_hidden_default_zone;
#include <gc.h>
extern NSZone* __nszone_private_hidden_atomic_zone;
#define
extern inline NSZone* NSCreateZone (size_t start, size_t gran, BOOL canFree)
{ return __nszone_private_hidden_default_zone; }
@ -76,12 +78,20 @@ extern inline NSZone* NSCreateZone (size_t start, size_t gran, BOOL canFree)
extern inline NSZone* NSDefaultMallocZone (void)
{ return __nszone_private_hidden_default_zone; }
extern inline NSZone* GSAtomicMallocZone (void)
{ return __nszone_private_hidden_atomict_zone; }
extern inline NSZone* NSZoneFromPointer (void *ptr)
{ return __nszone_private_hidden_default_zone; }
extern inline void* NSZoneMalloc (NSZone *zone, size_t size)
{
void *ptr = (void*)GC_MALLOC(size);
void *ptr;
if (zone == GSAtomicMallocZone())
*ptr = (void*)GC_MALLOC_ATOMIC(size);
else
*ptr = (void*)GC_MALLOC(size);
if (ptr == 0)
ptr = GSOutOfMemory(size, YES);
@ -91,9 +101,13 @@ extern inline void* NSZoneMalloc (NSZone *zone, size_t size)
extern inline void* NSZoneCalloc (NSZone *zone, size_t elems, size_t bytes)
{
size_t size = elems * bytes;
void *ptr = (void*)GC_MALLOC(size);
void *ptr;
if (zone == __nszone_private_hidden_atomic_zone)
*ptr = (void*)GC_MALLOC_ATOMIC(size);
else
*ptr = (void*)GC_MALLOC(size);
void *ptr = (void*)GC_MALLOC(size, YES);
if (ptr == 0)
ptr = GSOutOfMemory(size);
memset(ptr, '\0', size);
@ -130,11 +144,7 @@ extern inline NSString* NSZoneName (NSZone *zone)
extern inline void* NSZoneMallocAtomic (NSZone *zone, size_t size)
{
void *ptr = (void*)GC_MALLOC_ATOMIC(size);
if (ptr == 0)
ptr = GSOutOfMemory(size, YES);
return ptr;
return NSZoneMalloc(GSAtomicmallocZone(), size);
}
extern inline BOOL NSZoneCheck (NSZone *zone)
@ -158,6 +168,11 @@ extern inline NSZone* NSDefaultMallocZone (void)
return __nszone_private_hidden_default_zone;
}
extern inline NSZone* GSAtomicMallocZone (void)
{
return NSDefaultMallocZone();
}
extern NSZone* NSZoneFromPointer (void *ptr);
extern inline void* NSZoneMalloc (NSZone *zone, size_t size)

View file

@ -281,42 +281,37 @@ static void
GSFinalize(void* object, void* data)
{
[(id)object gcFinalize];
/* Set the class of anObject to FREED_OBJECT. The further messages to this
object will cause an error to occur. */
((id)object)->class_pointer = __freedObjectClass;
#ifndef NDEBUG
GSDebugAllocationRemove(((id)object)->class_pointer);
#endif
((id)object)->class_pointer = (void*) 0xdeadface;
((id)object)->class_pointer = (void*)0xdeadface;
}
inline NSObject *
NSAllocateObject (Class aClass, unsigned extraBytes, NSZone *zone)
NSAllocateObject(Class aClass, unsigned extraBytes, NSZone *zone)
{
id new = nil;
int size = aClass->instance_size + extraBytes;
if (CLS_ISCLASS (aClass))
new = NSZoneMalloc (zone, size);
id new = nil;
int size = aClass->instance_size + extraBytes;
if (CLS_ISCLASS(aClass))
new = NSZoneMalloc(zone, size);
if (new != nil)
{
memset (new, 0, size);
memset(new, 0, size);
new->class_pointer = aClass;
}
if ([new respondsToSelector: @selector(gcFinalize)])
{
if (__objc_responds_to(new, @selector(gcFinalize)))
{
#ifndef NDEBUG
/*
* We only do allocation counting for objects that can be
* finalised - for other objects we have no way of decrementing
* the count when the object is collected.
*/
GSDebugAllocationAdd(aClass);
/*
* We only do allocation counting for objects that can be
* finalised - for other objects we have no way of decrementing
* the count when the object is collected.
*/
GSDebugAllocationAdd(aClass);
#endif
GC_REGISTER_FINALIZER (new, GSFinalize, NULL, NULL, NULL);
GC_REGISTER_FINALIZER (new, GSFinalize, NULL, NULL, NULL);
}
}
return new;
}

View file

@ -1759,11 +1759,9 @@ NSZoneStats (NSZone *zone)
#else
/*
* Dummy zone used with garbage collection.
* In some places we make a distinction between the nul zone and the dummy
* zone - items pointed to by memory in the nul zone can be deallocated by
* the gc mechanism, while those pointed to from memory in the dummy zone
* can't.
* Dummy zones used with garbage collection.
* The 'atomic' zone is for memory that will be assumed not to contain
* pointers for garbage collection purposes.
*/
static NSZone default_zone =
{
@ -1771,5 +1769,11 @@ static NSZone default_zone =
};
NSZone* __nszone_private_hidden_default_zone = &default_zone;
static NSZone atomic_zone =
{
0, 0, 0, 0, 0, 0, 0, 0, @"default", 0
};
NSZone* __nszone_private_hidden_atomic_zone = &atomic_zone;
#endif /* GS_WITH_GC */