summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sturmlechner <asturm@gentoo.org>2021-06-17 14:45:37 +0200
committerAndreas Sturmlechner <asturm@gentoo.org>2021-06-17 14:47:17 +0200
commit39c12693d5372029f54a3b853179bf4c7fada1c3 (patch)
tree7715557a93a98406b83d352ae7a1e12ec311b89d
parentdev-cpp/yaml-cpp: enable tests, take package (diff)
downloadgentoo-39c12693d5372029f54a3b853179bf4c7fada1c3.tar.gz
gentoo-39c12693d5372029f54a3b853179bf4c7fada1c3.tar.bz2
gentoo-39c12693d5372029f54a3b853179bf4c7fada1c3.zip
dev-util/mdds: Fix rtree_test
See also: https://gitlab.com/mdds/mdds/-/issues/66 Upstream commit 7ab81002fe127d16602b85b391c1d1b0422a9afd Thanks-to: Paul Mulders <justinkb@gmail.com> Closes: https://bugs.gentoo.org/775056 Package-Manager: Portage-3.0.20, Repoman-3.0.3 Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
-rw-r--r--dev-util/mdds/files/mdds-1.7.0-rtree_test.patch52
-rw-r--r--dev-util/mdds/mdds-1.7.0.ebuild3
2 files changed, 54 insertions, 1 deletions
diff --git a/dev-util/mdds/files/mdds-1.7.0-rtree_test.patch b/dev-util/mdds/files/mdds-1.7.0-rtree_test.patch
new file mode 100644
index 000000000000..391f89798915
--- /dev/null
+++ b/dev-util/mdds/files/mdds-1.7.0-rtree_test.patch
@@ -0,0 +1,52 @@
+From 7ab81002fe127d16602b85b391c1d1b0422a9afd Mon Sep 17 00:00:00 2001
+From: Kohei Yoshida <kohei.yoshida@gmail.com>
+Date: Mon, 14 Jun 2021 22:52:14 -0400
+Subject: [PATCH] std::deque::erase invalidates all elements if the erased
+ element ...
+
+... is not the first or the last element. My previous assumption (
+that only the elements that occur after the erased element become
+invalid) was in fact wrong.
+
+This should resolve #66.
+---
+ include/mdds/rtree_def.inl | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+diff --git a/include/mdds/rtree_def.inl b/include/mdds/rtree_def.inl
+index ed0e9be..84f0673 100644
+--- a/include/mdds/rtree_def.inl
++++ b/include/mdds/rtree_def.inl
+@@ -836,17 +836,20 @@ bool rtree<_Key,_Value,_Trait>::directory_node::erase(const node_store* ns)
+ if (it == children.end())
+ return false;
+
+- it = children.erase(it);
++ // NB: std::deque::erase invalidates all elements when the erased element
++ // is somwhere in the middle. But if the erased element is either the
++ // first or the last element, only the erased element becomes invalidated.
+
+- // All nodes that occur after the erased node have their memory addresses
+- // shifted.
++ std::size_t pos = std::distance(children.begin(), it);
++ bool all_valid = pos == 0 || pos == children.size() - 1;
+
+- std::for_each(it, children.end(),
+- [](node_store& this_ns)
+- {
+- this_ns.valid_pointer = false;
+- }
+- );
++ it = children.erase(it);
++
++ if (!all_valid)
++ {
++ for (node_store& ns : children)
++ ns.valid_pointer = false;
++ }
+
+ return true;
+ }
+--
+GitLab
+
diff --git a/dev-util/mdds/mdds-1.7.0.ebuild b/dev-util/mdds/mdds-1.7.0.ebuild
index 6bd8e95ff762..62a57426b645 100644
--- a/dev-util/mdds/mdds-1.7.0.ebuild
+++ b/dev-util/mdds/mdds-1.7.0.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2020 Gentoo Authors
+# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
@@ -33,6 +33,7 @@ RDEPEND="${DEPEND}"
PATCHES=(
"${FILESDIR}/${PN}-1.5.0-buildsystem.patch"
"${FILESDIR}/${P}-bashism.patch" # bug 723094
+ "${FILESDIR}/${P}-rtree_test.patch" # bug 775056
)
pkg_pretend() {