diff --git a/ChangeLog b/ChangeLog index 31bbe7706..3debf2180 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Tue Sep 28 9:54:00 1999 Richard Frith-Macdonald +Tue Sep 28 11:45:00 1999 Richard Frith-Macdonald * 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 ([-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 diff --git a/Headers/gnustep/base/GSIArray.h b/Headers/gnustep/base/GSIArray.h index 550c84fb2..9484bbb5a 100644 --- a/Headers/gnustep/base/GSIArray.h +++ b/Headers/gnustep/base/GSIArray.h @@ -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; } diff --git a/Headers/gnustep/base/GSIMap.h b/Headers/gnustep/base/GSIMap.h index ff55b1e6e..e75da64bf 100644 --- a/Headers/gnustep/base/GSIMap.h +++ b/Headers/gnustep/base/GSIMap.h @@ -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; diff --git a/Headers/gnustep/base/NSZone.h b/Headers/gnustep/base/NSZone.h index b1f817f00..b78d7c662 100644 --- a/Headers/gnustep/base/NSZone.h +++ b/Headers/gnustep/base/NSZone.h @@ -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 Date: January 1997 @@ -69,6 +69,8 @@ extern NSZone* __nszone_private_hidden_default_zone; #include +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) diff --git a/Source/NSObject.m b/Source/NSObject.m index 337210bbc..52d3e3c05 100644 --- a/Source/NSObject.m +++ b/Source/NSObject.m @@ -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; } diff --git a/Source/NSZone.m b/Source/NSZone.m index d0e193299..c4f4f6a76 100644 --- a/Source/NSZone.m +++ b/Source/NSZone.m @@ -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 */