diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp index 45b465955..c5a4b51cc 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.cpp @@ -526,7 +526,7 @@ void RsGxsChannelPostsModel::updateSinglePost(const RsGxsChannelPost& post,std:: triggerViewUpdate(true,false); } -void RsGxsChannelPostsModel::setPosts(const RsGxsChannelGroup& group, std::vector& posts) +void RsGxsChannelPostsModel::setPosts(const RsGxsChannelGroup& group, std::vector&& posts) { preMods(); @@ -535,9 +535,17 @@ void RsGxsChannelPostsModel::setPosts(const RsGxsChannelGroup& group, std::vecto // createPostsArray(posts); - mPosts = posts; + // The caller hands over its array and discards it right after, so take it + // rather than deep copying every post (and every thumbnail) one more time. + mPosts = std::move(posts); + + // update_posts() already sorted the array in its loader thread. Kept as a + // cheap safety net for any other caller: on already ordered input this only + // costs comparisons, no element is moved. std::sort(mPosts.begin(),mPosts.end()); + mFilteredPosts.reserve(mPosts.size()); + for(uint32_t i=0;ibegin(),posts->end()); + #ifdef DEBUG_CHANNEL_MODEL std::cerr << "Got channel all content for channel " << group_id << std::endl; std::cerr << " posts : " << posts->size() << std::endl; @@ -609,7 +624,7 @@ void RsGxsChannelPostsModel::update_posts(const RsGxsGroupId& group_id) * Qt::QueuedConnection is important! */ - setPosts(group,*posts) ; + setPosts(group,std::move(*posts)) ; delete posts; diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h index ad69e7594..a13712a41 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsModel.h @@ -239,7 +239,8 @@ private: //void computeMessagesHierarchy(const RsGxsChannelGroup& forum_group, const std::vector &msgs_array, std::vector &posts, std::map > > &mPostVersions); void old_createPostsArray(std::vector &posts); void createPostsArray(std::vector& posts); - void setPosts(const RsGxsChannelGroup& group, std::vector &posts); + /// Takes ownership of posts: the array is moved into the model. + void setPosts(const RsGxsChannelGroup& group, std::vector &&posts); public: void updateSinglePost(const RsGxsChannelPost& post, std::set& added_files, std::set& removed_files); private: