mirror of
https://github.com/gnustep/libs-gdl2.git
synced 2025-02-22 19:01:04 +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>
|
2004-09-24 David Ayers <d.ayers@inode.at>
|
||||||
|
|
||||||
* EOAccess/EOEntity.m (-[setName:],-[setExternalName:])
|
* EOAccess/EOEntity.m (-[setName:],-[setExternalName:])
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue