mirror of
https://github.com/gnustep/libs-gdl2.git
synced 2025-02-21 02:20:55 +00:00
* 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:
parent
1b24b40493
commit
ae04f71bdf
2 changed files with 69 additions and 36 deletions
12
ChangeLog
12
ChangeLog
|
@ -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>
|
||||
|
||||
* EOAccess/EOEntity.m (-[setName:],-[setExternalName:])
|
||||
|
|
|
@ -288,9 +288,10 @@ static EODelayedObserverQueue *observerQueue;
|
|||
return self;
|
||||
}
|
||||
|
||||
- (void)_notifyObservers
|
||||
- (void)_notifyObservers: (id)ignore
|
||||
{
|
||||
[self notifyObserversUpToPriority: EOObserverPrioritySixth];
|
||||
_haveEntryInNotificationQueue = NO;
|
||||
}
|
||||
|
||||
- (void)enqueueObserver: (EODelayedObserver *)observer
|
||||
|
@ -301,40 +302,46 @@ static EODelayedObserverQueue *observerQueue;
|
|||
[observer subjectChanged];
|
||||
else
|
||||
{
|
||||
NSAssert2(observer->_next != nil, @"observer:%@ has ->next:%@",
|
||||
observer, observer->_next);
|
||||
|
||||
if (_queue[priority])
|
||||
{
|
||||
EODelayedObserver *obj = _queue[priority];
|
||||
EODelayedObserver *last = nil;
|
||||
|
||||
while (YES)
|
||||
for (; obj != nil && obj != observer; obj = obj->_next)
|
||||
{
|
||||
if (obj == observer)
|
||||
return;
|
||||
|
||||
obj = obj->_next;
|
||||
|
||||
if (!obj)
|
||||
{
|
||||
obj->_next = observer;
|
||||
|
||||
if (priority > _highestNonEmptyQueue)
|
||||
{
|
||||
_highestNonEmptyQueue = priority;
|
||||
_haveEntryInNotificationQueue = YES;
|
||||
}
|
||||
|
||||
break;;
|
||||
}
|
||||
last = obj;
|
||||
}
|
||||
|
||||
if (obj == observer)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
NSAssert(last != nil, @"Currupted Queue");
|
||||
last->_next = observer;
|
||||
}
|
||||
else
|
||||
_queue[priority] = observer;
|
||||
|
||||
[[NSRunLoop currentRunLoop]
|
||||
performSelector: @selector(_notifyObservers)
|
||||
target: self
|
||||
argument: nil
|
||||
order: EOFlushDelayedObserversRunLoopOrdering
|
||||
modes: _modes];
|
||||
if (priority > _highestNonEmptyQueue)
|
||||
{
|
||||
_highestNonEmptyQueue = priority;
|
||||
}
|
||||
|
||||
if (_haveEntryInNotificationQueue == NO)
|
||||
{
|
||||
[[NSRunLoop currentRunLoop]
|
||||
performSelector: @selector(_notifyObservers:)
|
||||
target: self
|
||||
argument: nil
|
||||
order: EOFlushDelayedObserversRunLoopOrdering
|
||||
modes: _modes];
|
||||
|
||||
_haveEntryInNotificationQueue = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -354,9 +361,15 @@ static EODelayedObserverQueue *observerQueue;
|
|||
if (obj == observer)
|
||||
{
|
||||
if (last)
|
||||
last->_next = obj->_next;
|
||||
{
|
||||
last->_next = obj->_next;
|
||||
obj->_next = nil;
|
||||
}
|
||||
else
|
||||
_queue[priority] = obj->_next;
|
||||
{
|
||||
_queue[priority] = obj->_next;
|
||||
obj->_next = nil;
|
||||
}
|
||||
|
||||
|
||||
if (!_queue[priority])
|
||||
|
@ -367,9 +380,9 @@ static EODelayedObserverQueue *observerQueue;
|
|||
{
|
||||
for (; i > EOObserverPriorityImmediate; --i)
|
||||
{
|
||||
if (_queue[priority])
|
||||
if (_queue[i])
|
||||
{
|
||||
_highestNonEmptyQueue = priority;
|
||||
_highestNonEmptyQueue = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -379,7 +392,6 @@ static EODelayedObserverQueue *observerQueue;
|
|||
|| i == 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
|
||||
{
|
||||
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 = observer->_next;
|
||||
i = EOObserverPriorityFirst;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue