mirror of
https://github.com/gnustep/libs-gdl2.git
synced 2025-04-23 05:00:46 +00:00
* EOControl/EOObserver.m (EOObserverCenter): Don't retain
observers. Use a GSIArray instaed of NSMutableArray. (+addObserver:forObject:, +removeObserver:forObject:): Ditto. (+initialize, +notifyObserversObjectWillChange:): Ditto. (+observersForObject:, addOmniscientObserver:): Ditto. (+removeOmniscientObserver:): Ditto. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@21232 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
dc8101ef3f
commit
44d8935e49
2 changed files with 105 additions and 35 deletions
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
|||
2005-05-18 Matt Rice <ratmice@yahoo.com>
|
||||
|
||||
* EOControl/EOObserver.m (EOObserverCenter): Don't retain observers.
|
||||
Use a GSIArray instaed of NSMutableArray.
|
||||
(+addObserver:forObject:, +removeObserver:forObject:): Ditto.
|
||||
(+initialize, +notifyObserversObjectWillChange:): Ditto.
|
||||
(+observersForObject:, addOmniscientObserver:): Ditto.
|
||||
(+removeOmniscientObserver:): Ditto.
|
||||
|
||||
2005-05-17 Matt Rice <ratmice@yahoo.com>
|
||||
|
||||
* GNUmakefile: remove GDL2Palette from top level compilation.
|
||||
* GDL2Palette/GNUmakefile: Fix compilation flags, include gdl2.make
|
||||
relative not the installed version.
|
||||
* DBModeler/GNUmakefile: Ditto.
|
||||
|
||||
2005-05-11 Matt Rice <ratmice@yahoo.com>
|
||||
|
||||
* GNUmakefile: Compile EOInterface, EOModeler, DBModeler, GDL2Palette
|
||||
|
|
|
@ -55,6 +55,15 @@ RCS_ID("$Id$")
|
|||
#include <EOControl/EOObserver.h>
|
||||
#include <EOControl/EODebug.h>
|
||||
|
||||
#ifdef GSIArray
|
||||
#undef GSIArray
|
||||
#endif
|
||||
|
||||
#define GSI_ARRAY_TYPES GSUNION_OBJ
|
||||
#define GSI_ARRAY_NO_RETAIN 1
|
||||
#define GSI_ARRAY_NO_RELEASE 1
|
||||
#include <GNUstepBase/GSIArray.h>
|
||||
|
||||
|
||||
@implementation NSObject (EOObserver)
|
||||
|
||||
|
@ -97,7 +106,7 @@ RCS_ID("$Id$")
|
|||
@implementation EOObserverCenter
|
||||
|
||||
static NSMapTable *observersMap = NULL;
|
||||
static NSMutableArray *omniscientObservers=nil;
|
||||
static GSIArray omniscientObservers = NULL;
|
||||
static unsigned int notificationSuppressCount=0;
|
||||
static id lastObject;
|
||||
|
||||
|
@ -105,10 +114,10 @@ static id lastObject;
|
|||
+ (void)initialize
|
||||
{
|
||||
observersMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks,
|
||||
NSObjectMapValueCallBacks,
|
||||
NSNonOwnedPointerMapValueCallBacks,
|
||||
32);
|
||||
|
||||
omniscientObservers = [NSMutableArray new];
|
||||
omniscientObservers = NSZoneMalloc(NSDefaultMallocZone(), sizeof(GSIArray_t));
|
||||
GSIArrayInitWithZoneAndCapacity(omniscientObservers, NSDefaultMallocZone(), 32);
|
||||
lastObject = nil;
|
||||
|
||||
notificationSuppressCount = 0;
|
||||
|
@ -120,17 +129,20 @@ static id lastObject;
|
|||
* the object. This does not retain the object. It is the observers
|
||||
* responsibility to unregister the object with [-removeObserver:forObject:]
|
||||
* before the object ceases to exist.
|
||||
* The observer is also not retained. It is the observers responsibility
|
||||
* to unregister before it ceases to exist.
|
||||
*/
|
||||
+ (void)addObserver: (id <EOObserving>)observer forObject: (id)object
|
||||
{
|
||||
NSMutableArray *observersArray;
|
||||
GSIArray observersArray;
|
||||
|
||||
observersArray = NSMapGet(observersMap, object);
|
||||
|
||||
if (observersArray == nil)
|
||||
if (observersArray == NULL)
|
||||
{
|
||||
observersArray = [NSMutableArray arrayWithCapacity: 16];
|
||||
[observersArray addObject: observer];
|
||||
observersArray = NSZoneMalloc([self zone], sizeof(GSIArray_t));
|
||||
GSIArrayInitWithZoneAndCapacity(observersArray, [self zone], 16);
|
||||
GSIArrayAddItemNoRetain(observersArray, (GSIArrayItem)observer);
|
||||
|
||||
/* The object is not retained. It is the responsibility
|
||||
of the observer to remove the object before it ceases
|
||||
|
@ -139,8 +151,13 @@ static id lastObject;
|
|||
}
|
||||
else
|
||||
{
|
||||
if ([observersArray containsObject: observer] == NO)
|
||||
[observersArray addObject: observer];
|
||||
int i,c;
|
||||
BOOL found = NO;
|
||||
|
||||
for (i = 0, c = GSIArrayCount(observersArray); found == NO && i < c; i++)
|
||||
found = [GSIArrayItemAtIndex(observersArray, i).obj isEqual:observer];
|
||||
if (found == NO)
|
||||
GSIArrayAddItemNoRetain(observersArray, (GSIArrayItem)observer);
|
||||
else
|
||||
NSDebugMLog(@"Observer: %@ for object: %@(%p) added multiple times.",
|
||||
observer, NSStringFromClass(GSObjCClass(object)), object);
|
||||
|
@ -153,15 +170,22 @@ static id lastObject;
|
|||
*/
|
||||
+ (void)removeObserver: (id <EOObserving>)observer forObject: (id)object
|
||||
{
|
||||
NSMutableArray *observersArray;
|
||||
GSIArray observersArray;
|
||||
|
||||
observersArray = NSMapGet(observersMap, object);
|
||||
|
||||
if (observersArray)
|
||||
{
|
||||
[observersArray removeObject: observer];
|
||||
int i,c;
|
||||
|
||||
for (i = 0, c = GSIArrayCount(observersArray); i < c; i++)
|
||||
if ([GSIArrayItemAtIndex(observersArray, i).obj isEqual:observer])
|
||||
{
|
||||
GSIArrayRemoveItemAtIndex(observersArray, i);
|
||||
break;
|
||||
}
|
||||
|
||||
if (![observersArray count])
|
||||
if (!GSIArrayCount(observersArray))
|
||||
{
|
||||
NSMapRemove(observersMap, object);
|
||||
/* The object is not released. It is the responsibility
|
||||
|
@ -197,27 +221,34 @@ static id lastObject;
|
|||
lastObject = nil;
|
||||
else if (lastObject != object)
|
||||
{
|
||||
NSMutableArray *observersArray;
|
||||
NSEnumerator *obsEnum;
|
||||
GSIArray observersArray;
|
||||
id<EOObserving> observer;
|
||||
int i, c;
|
||||
|
||||
lastObject = object;
|
||||
|
||||
observersArray = NSMapGet(observersMap, object);
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOObserver", @"observersArray count=%d",
|
||||
[observersArray count]);
|
||||
|
||||
obsEnum = [observersArray objectEnumerator];
|
||||
while ((observer = [obsEnum nextObject]))
|
||||
[observer objectWillChange: object];
|
||||
|
||||
if (observersArray)
|
||||
{
|
||||
c = GSIArrayCount(observersArray);
|
||||
EOFLOGObjectLevelArgs(@"EOObserver", @"observersArray count=%d",
|
||||
c);
|
||||
|
||||
for (i = 0; i < c; i++)
|
||||
{
|
||||
observer = GSIArrayItemAtIndex(observersArray, i).obj;
|
||||
[observer objectWillChange:object];
|
||||
}
|
||||
}
|
||||
|
||||
c = GSIArrayCount(omniscientObservers);
|
||||
EOFLOGObjectLevelArgs(@"EOObserver", @"omniscientObservers count=%d",
|
||||
[omniscientObservers count]);
|
||||
|
||||
obsEnum = [omniscientObservers objectEnumerator];
|
||||
while ((observer = [obsEnum nextObject]))
|
||||
[observer objectWillChange: nil];
|
||||
c);
|
||||
for (i = 0; i < c; i++)
|
||||
{
|
||||
observer = GSIArrayItemAtIndex(omniscientObservers, i).obj;
|
||||
[observer objectWillChange:nil];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -235,7 +266,14 @@ static id lastObject;
|
|||
*/
|
||||
+ (NSArray *)observersForObject: (id)object
|
||||
{
|
||||
return AUTORELEASE([(id)NSMapGet(observersMap, object) copy]);
|
||||
GSIArray observersArray;
|
||||
int c, i;
|
||||
id *observers;
|
||||
observersArray = NSMapGet(observersMap, object);
|
||||
c = GSIArrayCount(observersArray);
|
||||
observers = (id *)GSIArrayItems(observersArray);
|
||||
|
||||
return [NSArray arrayWithObjects:observers count:c];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -244,7 +282,7 @@ static id lastObject;
|
|||
*/
|
||||
+ (id)observerForObject: (id)object ofClass: (Class)targetClass
|
||||
{
|
||||
NSArray *observersArray;
|
||||
GSIArray observersArray;
|
||||
|
||||
observersArray = NSMapGet(observersMap, object);
|
||||
|
||||
|
@ -253,10 +291,10 @@ static id lastObject;
|
|||
unsigned i, count;
|
||||
id observer;
|
||||
|
||||
count = [observersArray count];
|
||||
count = GSIArrayCount(observersArray);
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
observer = [observersArray objectAtIndex: i];
|
||||
observer = GSIArrayItemAtIndex(observersArray,i).obj;
|
||||
if ([observer isKindOfClass: targetClass])
|
||||
return observer;
|
||||
}
|
||||
|
@ -311,8 +349,14 @@ static id lastObject;
|
|||
*/
|
||||
+ (void)addOmniscientObserver: (id <EOObserving>)observer
|
||||
{
|
||||
if ([omniscientObservers containsObject: observer] == NO)
|
||||
[omniscientObservers addObject: observer];
|
||||
int i,c;
|
||||
BOOL found = NO;
|
||||
|
||||
for (i = 0, c = GSIArrayCount(omniscientObservers); found == NO && i < c; i++)
|
||||
found = [GSIArrayItemAtIndex(omniscientObservers, i).obj isEqual:observer];
|
||||
|
||||
if (found == NO)
|
||||
GSIArrayAddItemNoRetain(omniscientObservers, (GSIArrayItem)observer);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -320,7 +364,17 @@ static id lastObject;
|
|||
*/
|
||||
+ (void)removeOmniscientObserver: (id <EOObserving>)observer
|
||||
{
|
||||
[omniscientObservers removeObject: observer];
|
||||
int i,c;
|
||||
|
||||
c = GSIArrayCount(omniscientObservers);
|
||||
for (i = 0, c = GSIArrayCount(omniscientObservers); i < c; i++)
|
||||
{
|
||||
if ([GSIArrayItemAtIndex(omniscientObservers, i).obj isEqual:observer])
|
||||
{
|
||||
GSIArrayRemoveItemAtIndex(omniscientObservers, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
Loading…
Reference in a new issue