From f4d44cd47dcb15a9ff5a7d2bf26ae6ec5282b6f9 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 18 Jun 2011 03:22:31 +0000 Subject: [PATCH] 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 --- src/kits/tracker/PendingNodeMonitorCache.cpp | 24 +++++++++----------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/kits/tracker/PendingNodeMonitorCache.cpp b/src/kits/tracker/PendingNodeMonitorCache.cpp index e75aa20ced..4586323ec3 100644 --- a/src/kits/tracker/PendingNodeMonitorCache.cpp +++ b/src/kits/tracker/PendingNodeMonitorCache.cpp @@ -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++; }