Some pose performance improvements by aldeck and myself:
1) We don't need to call FindPose() on every pose as we're freshly adding it, and a duplicate should never happen in this circumstance (the FindPose() is still there if Tracker is compiled in debug mode however. 2) Adjust the FSClipboard calls such that the locking is optional. This allows us to lock once per CreatePoses group rather than once per pose. Together these changes make for a significant performance improvement when it comes to populating a large folder. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29198 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
3e01561729
commit
95da064570
src/kits/tracker
@ -504,11 +504,13 @@ FSClipboardPaste(Model *model, uint32 linksMode)
|
||||
*/
|
||||
|
||||
uint32
|
||||
FSClipboardFindNodeMode(Model *model, bool updateRefIfNeeded)
|
||||
FSClipboardFindNodeMode(Model *model, bool autoLock, bool updateRefIfNeeded)
|
||||
{
|
||||
int32 moveMode = 0;
|
||||
|
||||
if (be_clipboard->Lock()) {
|
||||
if (autoLock) {
|
||||
if (!be_clipboard->Lock())
|
||||
return 0;
|
||||
}
|
||||
bool remove = false;
|
||||
bool change = false;
|
||||
|
||||
@ -546,11 +548,11 @@ FSClipboardFindNodeMode(Model *model, bool updateRefIfNeeded)
|
||||
if (change)
|
||||
be_clipboard->Commit();
|
||||
|
||||
if (autoLock)
|
||||
be_clipboard->Unlock();
|
||||
|
||||
if (remove)
|
||||
FSClipboardRemove(model);
|
||||
}
|
||||
|
||||
return (uint32)moveMode;
|
||||
}
|
||||
|
@ -90,6 +90,6 @@ uint32 FSClipboardAddPoses(const node_ref *directory, PoseList *list, uint32 mov
|
||||
uint32 FSClipboardRemovePoses(const node_ref *directory, PoseList *list);
|
||||
bool FSClipboardPaste(Model *model, uint32 linksMode = 0);
|
||||
void FSClipboardRemove(Model *model);
|
||||
uint32 FSClipboardFindNodeMode(Model *model, bool updateRefIfNeeded);
|
||||
uint32 FSClipboardFindNodeMode(Model *model, bool autoLock, bool updateRefIfNeeded);
|
||||
|
||||
#endif /* FS_CLIPBOARD_H */
|
||||
|
@ -66,9 +66,10 @@ CalcFreeSpace(BVolume *volume)
|
||||
// everything else, like the attributes, etc. is retrieved directly from the
|
||||
// symlink itself
|
||||
|
||||
BPose::BPose(Model *model, BPoseView *view, bool selected)
|
||||
BPose::BPose(Model *model, BPoseView *view, uint32 clipboardMode, bool selected)
|
||||
: fModel(model),
|
||||
fWidgetList(4, true),
|
||||
fClipboardMode(clipboardMode),
|
||||
fPercent(-1),
|
||||
fIsSelected(selected),
|
||||
fDelayedEdit(true),
|
||||
@ -108,11 +109,6 @@ BPose::BPose(Model *model, BPoseView *view, bool selected)
|
||||
} else
|
||||
delete volume;
|
||||
}
|
||||
|
||||
if ((fClipboardMode = FSClipboardFindNodeMode(model,true)) != 0
|
||||
&& !view->HasPosesInClipboard()) {
|
||||
view->SetHasPosesInClipboard(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@ enum {
|
||||
|
||||
class BPose {
|
||||
public:
|
||||
BPose(Model *adopt, BPoseView *, bool selected = false);
|
||||
BPose(Model *adopt, BPoseView *, uint32 clipboardMode, bool selected = false);
|
||||
virtual ~BPose();
|
||||
|
||||
BTextWidget *AddWidget(BPoseView *, BColumn *);
|
||||
|
@ -1615,12 +1615,15 @@ BPoseView::CreatePoses(Model **models, PoseInfo *poseInfoArray, int32 count,
|
||||
else
|
||||
viewBounds = Bounds();
|
||||
|
||||
be_clipboard->Lock();
|
||||
|
||||
int32 poseIndex = 0;
|
||||
uint32 clipboardMode = 0;
|
||||
float listViewScrollBy = 0;
|
||||
for (int32 modelIndex = 0; modelIndex < count; modelIndex++) {
|
||||
Model *model = models[modelIndex];
|
||||
|
||||
if (FindPose(model) || FindZombie(model->NodeRef())) {
|
||||
ASSERT(!FindPose(model));
|
||||
if (FindZombie(model->NodeRef())) {
|
||||
// we already have this pose, don't add it
|
||||
watch_node(model->NodeRef(), B_STOP_WATCHING, this);
|
||||
delete model;
|
||||
@ -1629,12 +1632,17 @@ BPoseView::CreatePoses(Model **models, PoseInfo *poseInfoArray, int32 count,
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((clipboardMode = FSClipboardFindNodeMode(model,false,true)) != 0
|
||||
&& !HasPosesInClipboard()) {
|
||||
SetHasPosesInClipboard(true);
|
||||
}
|
||||
|
||||
model->OpenNode();
|
||||
ASSERT(model->IsNodeOpen());
|
||||
PoseInfo *poseInfo = &poseInfoArray[modelIndex];
|
||||
|
||||
// pose adopts model and deletes it when done
|
||||
BPose *pose = new BPose(model, this);
|
||||
BPose *pose = new BPose(model, this, clipboardMode);
|
||||
|
||||
if (resultingPoses)
|
||||
resultingPoses[modelIndex] = pose;
|
||||
@ -1760,6 +1768,8 @@ BPoseView::CreatePoses(Model **models, PoseInfo *poseInfoArray, int32 count,
|
||||
model->CloseNode();
|
||||
}
|
||||
|
||||
be_clipboard->Unlock();
|
||||
|
||||
FinishPendingScroll(listViewScrollBy, viewBounds);
|
||||
|
||||
if (lastPoseIndexPtr)
|
||||
|
Loading…
x
Reference in New Issue
Block a user