* EOControl/EOObserver.m

(-[EODelayedObserverQueue _notifyObservers:]): Fix prototype
	set queue flag.
	(-[EODelayedObserverQueue enqueueObserver:]): Fix setting of
	queue flag and registering observers.
	(-[EODelayedObserverQueue dequeueObserver:]): Break linked
	list. Correct highestNonEmptyQueue setting.  Fix setting of queue
	flag.
	(-[EODelayedObserverQueue notifyObserversUpToPriority]):
	Dequeue observers during processing.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@20139 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
David Ayers 2004-09-25 19:47:36 +00:00
parent 1b24b40493
commit ae04f71bdf
2 changed files with 69 additions and 36 deletions

View file

@ -1,3 +1,15 @@
2004-09-25 David Ayers <d.ayers@inode.at>
* EOControl/EOObserver.m
(-[EODelayedObserverQueue _notifyObservers:]): Fix prototype set
queue flag.
(-[EODelayedObserverQueue enqueueObserver:]): Fix setting of queue
flag and registering observers.
(-[EODelayedObserverQueue dequeueObserver:]): Break linked list.
Correct highestNonEmptyQueue setting. Fix setting of queue flag.
(-[EODelayedObserverQueue notifyObserversUpToPriority]): Dequeue
observers during processing.
2004-09-24 David Ayers <d.ayers@inode.at> 2004-09-24 David Ayers <d.ayers@inode.at>
* EOAccess/EOEntity.m (-[setName:],-[setExternalName:]) * EOAccess/EOEntity.m (-[setName:],-[setExternalName:])

View file

@ -288,9 +288,10 @@ static EODelayedObserverQueue *observerQueue;
return self; return self;
} }
- (void)_notifyObservers - (void)_notifyObservers: (id)ignore
{ {
[self notifyObserversUpToPriority: EOObserverPrioritySixth]; [self notifyObserversUpToPriority: EOObserverPrioritySixth];
_haveEntryInNotificationQueue = NO;
} }
- (void)enqueueObserver: (EODelayedObserver *)observer - (void)enqueueObserver: (EODelayedObserver *)observer
@ -301,40 +302,46 @@ static EODelayedObserverQueue *observerQueue;
[observer subjectChanged]; [observer subjectChanged];
else else
{ {
NSAssert2(observer->_next != nil, @"observer:%@ has ->next:%@",
observer, observer->_next);
if (_queue[priority]) if (_queue[priority])
{ {
EODelayedObserver *obj = _queue[priority]; EODelayedObserver *obj = _queue[priority];
EODelayedObserver *last = nil;
while (YES) for (; obj != nil && obj != observer; obj = obj->_next)
{ {
last = obj;
}
if (obj == observer) if (obj == observer)
{
return; return;
obj = obj->_next;
if (!obj)
{
obj->_next = observer;
if (priority > _highestNonEmptyQueue)
{
_highestNonEmptyQueue = priority;
_haveEntryInNotificationQueue = YES;
} }
break;; NSAssert(last != nil, @"Currupted Queue");
} last->_next = observer;
}
} }
else else
_queue[priority] = observer; _queue[priority] = observer;
if (priority > _highestNonEmptyQueue)
{
_highestNonEmptyQueue = priority;
}
if (_haveEntryInNotificationQueue == NO)
{
[[NSRunLoop currentRunLoop] [[NSRunLoop currentRunLoop]
performSelector: @selector(_notifyObservers) performSelector: @selector(_notifyObservers:)
target: self target: self
argument: nil argument: nil
order: EOFlushDelayedObserversRunLoopOrdering order: EOFlushDelayedObserversRunLoopOrdering
modes: _modes]; modes: _modes];
_haveEntryInNotificationQueue = YES;
}
} }
} }
@ -354,9 +361,15 @@ static EODelayedObserverQueue *observerQueue;
if (obj == observer) if (obj == observer)
{ {
if (last) if (last)
{
last->_next = obj->_next; last->_next = obj->_next;
obj->_next = nil;
}
else else
{
_queue[priority] = obj->_next; _queue[priority] = obj->_next;
obj->_next = nil;
}
if (!_queue[priority]) if (!_queue[priority])
@ -367,9 +380,9 @@ static EODelayedObserverQueue *observerQueue;
{ {
for (; i > EOObserverPriorityImmediate; --i) for (; i > EOObserverPriorityImmediate; --i)
{ {
if (_queue[priority]) if (_queue[i])
{ {
_highestNonEmptyQueue = priority; _highestNonEmptyQueue = i;
break; break;
} }
} }
@ -379,7 +392,6 @@ static EODelayedObserverQueue *observerQueue;
|| i == EOObserverPriorityImmediate) || i == EOObserverPriorityImmediate)
{ {
_highestNonEmptyQueue = EOObserverPriorityImmediate; _highestNonEmptyQueue = EOObserverPriorityImmediate;
_haveEntryInNotificationQueue = NO;
} }
} }
@ -391,19 +403,28 @@ static EODelayedObserverQueue *observerQueue;
} }
} }
/**
* Note that unlike the reference implementation, we dequeue the
* observer after dispatching [EODelayedObserver-subjectChanged].
*/
- (void)notifyObserversUpToPriority: (EOObserverPriority)priority - (void)notifyObserversUpToPriority: (EOObserverPriority)priority
{ {
int i = _highestNonEmptyQueue; EOObserverPriority i = EOObserverPriorityFirst;
EODelayedObserver *observer = nil;
for (; i > EOObserverPriorityImmediate; i--) while (i <= priority)
{ {
EODelayedObserver *observer = _queue[i]; observer = _queue[i];
while (observer) if (observer)
{ {
[self dequeueObserver: observer];
[observer subjectChanged]; [observer subjectChanged];
i = EOObserverPriorityFirst;
observer = observer->_next; }
else
{
i++;
} }
} }
} }