mirror of
https://review.haiku-os.org/haiku
synced 2025-02-22 21:48:35 +01:00
Remove the monitor item before calling FSNotification() on it. Otherwise,
in some cases PoseView would call back into PoseCreatedOrMoved(), leading to an infinite recursion. Fixes #7696. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42229 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
bbfcd83bde
commit
f4d44cd47d
@ -53,13 +53,13 @@ PendingNodeMonitorEntry::NodeMonitor() const
|
||||
return &fNodeMonitor;
|
||||
}
|
||||
|
||||
bool
|
||||
bool
|
||||
PendingNodeMonitorEntry::Match(const node_ref *node) const
|
||||
{
|
||||
return fNode == *node;
|
||||
}
|
||||
|
||||
bool
|
||||
bool
|
||||
PendingNodeMonitorEntry::TooOld(bigtime_t now) const
|
||||
{
|
||||
return now > fExpiresAfter;
|
||||
@ -76,7 +76,7 @@ PendingNodeMonitorCache::~PendingNodeMonitorCache()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
PendingNodeMonitorCache::Add(const BMessage *message)
|
||||
{
|
||||
#if xDEBUG
|
||||
@ -91,39 +91,38 @@ PendingNodeMonitorCache::Add(const BMessage *message)
|
||||
fList.AddItem(new PendingNodeMonitorEntry(&node, message));
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
PendingNodeMonitorCache::RemoveEntries(const node_ref *nodeRef)
|
||||
{
|
||||
int32 count = fList.CountItems();
|
||||
for (int32 index = count - 1; index >= 0; index--)
|
||||
for (int32 index = count - 1; index >= 0; index--)
|
||||
if (fList.ItemAt(index)->Match(nodeRef))
|
||||
delete fList.RemoveItemAt(index);
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
PendingNodeMonitorCache::RemoveOldEntries()
|
||||
{
|
||||
bigtime_t now = system_time();
|
||||
int32 count = fList.CountItems();
|
||||
for (int32 index = count - 1; index >= 0; index--)
|
||||
for (int32 index = count - 1; index >= 0; index--)
|
||||
if (fList.ItemAt(index)->TooOld(now)) {
|
||||
PRINT(("removing old entry from pending node monitor cache\n"));
|
||||
delete fList.RemoveItemAt(index);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
PendingNodeMonitorCache::PoseCreatedOrMoved(BPoseView *poseView, const BPose *pose)
|
||||
{
|
||||
bigtime_t now = system_time();
|
||||
int32 count = fList.CountItems();
|
||||
for (int32 index = 0; index < count;) {
|
||||
for (int32 index = 0; index < fList.CountItems();) {
|
||||
PendingNodeMonitorEntry *item = fList.ItemAt(index);
|
||||
if (item->TooOld(now)) {
|
||||
PRINT(("removing old entry from pending node monitor cache\n"));
|
||||
delete fList.RemoveItemAt(index);
|
||||
count--;
|
||||
} else if (item->Match(pose->TargetModel()->NodeRef())) {
|
||||
fList.RemoveItemAt(index);
|
||||
#if DEBUG
|
||||
PRINT(("reapplying node monitor for model:\n"));
|
||||
pose->TargetModel()->PrintToStream();
|
||||
@ -132,8 +131,7 @@ PendingNodeMonitorCache::PoseCreatedOrMoved(BPoseView *poseView, const BPose *po
|
||||
#endif
|
||||
poseView->FSNotification(item->NodeMonitor());
|
||||
ASSERT(result);
|
||||
delete fList.RemoveItemAt(index);
|
||||
count--;
|
||||
delete item;
|
||||
} else
|
||||
index++;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user