Skip to content
This repository was archived by the owner on Mar 22, 2023. It is now read-only.

Commit eb914d0

Browse files
Merge pull request #1124 from igchor/radix_template_mt
Radix tree: make mt mode a template parameter
2 parents 9d4af67 + 4572774 commit eb914d0

File tree

8 files changed

+873
-733
lines changed

8 files changed

+873
-733
lines changed

include/libpmemobj++/experimental/radix_tree.hpp

Lines changed: 696 additions & 615 deletions
Large diffs are not rendered by default.

tests/common/map_wrapper.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ struct test_bytes_view;
4848
template <typename T>
4949
struct test_bytes_view<
5050
T, typename std::enable_if<!std::is_signed<T>::value>::type> {
51-
using type = pmem::detail::bytes_view<T>;
51+
using type = nvobjex::bytes_view<T>;
5252
};
5353

5454
struct test_bytes_view_int {
@@ -93,7 +93,7 @@ erase(C &m, Args &&... args) -> decltype(m.erase(std::forward<Args>(args)...))
9393
#define MAP_VALUE value()
9494
#define TRANSPARENT_COMPARE heterogeneous_bytes_view
9595
#define TRANSPARENT_COMPARE_NOT_REFERENCEABLE heterogeneous_bytes_view
96-
#define TRANSPARENT_COMPARE_STRING pmem::detail::bytes_view<pmem::obj::string>
96+
#define TRANSPARENT_COMPARE_STRING nvobjex::bytes_view<pmem::obj::string>
9797

9898
#endif
9999

tests/radix_tree/radix.hpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ using container_int =
1919
using container_string =
2020
nvobjex::radix_tree<nvobjex::inline_string, nvobjex::inline_string>;
2121

22-
using container_int_int = nvobjex::radix_tree<unsigned, nvobj::p<unsigned>>;
22+
using container_int_int =
23+
nvobjex::radix_tree<unsigned, nvobj::p<unsigned>,
24+
nvobjex::bytes_view<unsigned>, false>;
2325
using container_int_string =
2426
nvobjex::radix_tree<unsigned, nvobjex::inline_string>;
2527

@@ -33,6 +35,32 @@ using container_inline_s_u8t =
3335
nvobjex::radix_tree<nvobjex::basic_inline_string<uint8_t>,
3436
nvobjex::basic_inline_string<uint8_t>>;
3537

38+
using container_int_mt =
39+
nvobjex::radix_tree<nvobjex::inline_string, nvobj::p<unsigned>,
40+
nvobjex::bytes_view<nvobjex::inline_string>, true>;
41+
using container_string_mt =
42+
nvobjex::radix_tree<nvobjex::inline_string, nvobjex::inline_string,
43+
nvobjex::bytes_view<nvobjex::inline_string>, true>;
44+
45+
using container_int_int_mt =
46+
nvobjex::radix_tree<unsigned, nvobj::p<unsigned>,
47+
nvobjex::bytes_view<unsigned>, true>;
48+
using container_int_string_mt =
49+
nvobjex::radix_tree<unsigned, nvobjex::inline_string,
50+
nvobjex::bytes_view<unsigned>, true>;
51+
52+
using container_inline_s_wchart_mt = nvobjex::radix_tree<
53+
nvobjex::basic_inline_string<wchar_t>, nvobj::p<unsigned>,
54+
nvobjex::bytes_view<nvobjex::basic_inline_string<wchar_t>>, true>;
55+
using container_inline_s_wchart_wchart_mt = nvobjex::radix_tree<
56+
nvobjex::basic_inline_string<wchar_t>,
57+
nvobjex::basic_inline_string<wchar_t>,
58+
nvobjex::bytes_view<nvobjex::basic_inline_string<wchar_t>>, true>;
59+
using container_inline_s_u8t_mt = nvobjex::radix_tree<
60+
nvobjex::basic_inline_string<uint8_t>,
61+
nvobjex::basic_inline_string<uint8_t>,
62+
nvobjex::bytes_view<nvobjex::basic_inline_string<uint8_t>>, true>;
63+
3664
struct root {
3765
nvobj::persistent_ptr<container_int> radix_int;
3866
nvobj::persistent_ptr<container_string> radix_str;
@@ -44,6 +72,18 @@ struct root {
4472
nvobj::persistent_ptr<container_inline_s_wchart_wchart>
4573
radix_inline_s_wchart_wchart;
4674
nvobj::persistent_ptr<container_inline_s_u8t> radix_inline_s_u8t;
75+
76+
nvobj::persistent_ptr<container_int_mt> radix_int_mt;
77+
nvobj::persistent_ptr<container_string_mt> radix_str_mt;
78+
79+
nvobj::persistent_ptr<container_int_int_mt> radix_int_int_mt;
80+
nvobj::persistent_ptr<container_int_string_mt> radix_int_str_mt;
81+
82+
nvobj::persistent_ptr<container_inline_s_wchart_mt>
83+
radix_inline_s_wchart_mt;
84+
nvobj::persistent_ptr<container_inline_s_wchart_wchart_mt>
85+
radix_inline_s_wchart_wchart_mt;
86+
nvobj::persistent_ptr<container_inline_s_u8t_mt> radix_inline_s_u8t_mt;
4787
};
4888

4989
template <typename Container,

tests/radix_tree/radix_concurrent.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ test_write_find(nvobj::pool<root> &pop, nvobj::persistent_ptr<Container> &ptr)
5757
/* this test only works with int as a key type */
5858
static void
5959
test_various_readers(nvobj::pool<root> &pop,
60-
nvobj::persistent_ptr<container_int_int> &ptr)
60+
nvobj::persistent_ptr<container_int_int_mt> &ptr)
6161
{
6262
size_t threads = 16;
6363
if (On_drd)
@@ -72,19 +72,20 @@ test_various_readers(nvobj::pool<root> &pop,
7272
auto readers = std::vector<std::function<void()>>{
7373
[&]() {
7474
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
75-
auto res = ptr->find(key<container_int_int>(i));
75+
auto res =
76+
ptr->find(key<container_int_int_mt>(i));
7677
UT_ASSERT(res != ptr->end());
7778
UT_ASSERT(res->value() ==
78-
value<container_int_int>(i));
79+
value<container_int_int_mt>(i));
7980
}
8081
},
8182
[&]() {
8283
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
8384
auto res = ptr->lower_bound(
84-
key<container_int_int>(i));
85+
key<container_int_int_mt>(i));
8586
UT_ASSERT(res != ptr->end());
8687
UT_ASSERT(res->value() ==
87-
value<container_int_int>(i));
88+
value<container_int_int_mt>(i));
8889
}
8990
},
9091
[&]() {
@@ -93,15 +94,16 @@ test_various_readers(nvobj::pool<root> &pop,
9394
key<container_int_int>(i));
9495
UT_ASSERT(res != ptr->end());
9596
UT_ASSERT(res->value() ==
96-
value<container_int_int>(i + 1));
97+
value<container_int_int_mt>(i + 1));
9798
}
9899
},
99100
};
100101

101102
parallel_modify_read(writer, readers, threads);
102103

103-
nvobj::transaction::run(
104-
pop, [&] { nvobj::delete_persistent<container_int_int>(ptr); });
104+
nvobj::transaction::run(pop, [&] {
105+
nvobj::delete_persistent<container_int_int_mt>(ptr);
106+
});
105107

106108
UT_ASSERTeq(num_allocs(pop), 0);
107109
}
@@ -124,16 +126,17 @@ test(int argc, char *argv[])
124126
UT_FATAL("!pool::create: %s %s", pe.what(), path);
125127
}
126128

127-
test_write_find(pop, pop.root()->radix_int_int);
128-
test_various_readers(pop, pop.root()->radix_int_int);
129+
test_write_find(pop, pop.root()->radix_int_int_mt);
130+
test_various_readers(pop, pop.root()->radix_int_int_mt);
129131

130132
if (!On_drd) {
131-
test_write_find(pop, pop.root()->radix_int);
132-
test_write_find(pop, pop.root()->radix_int_str);
133-
test_write_find(pop, pop.root()->radix_str);
134-
test_write_find(pop, pop.root()->radix_inline_s_wchart_wchart);
135-
test_write_find(pop, pop.root()->radix_inline_s_wchart);
136-
test_write_find(pop, pop.root()->radix_inline_s_u8t);
133+
test_write_find(pop, pop.root()->radix_int_mt);
134+
test_write_find(pop, pop.root()->radix_int_str_mt);
135+
test_write_find(pop, pop.root()->radix_str_mt);
136+
test_write_find(pop,
137+
pop.root()->radix_inline_s_wchart_wchart_mt);
138+
test_write_find(pop, pop.root()->radix_inline_s_wchart_mt);
139+
test_write_find(pop, pop.root()->radix_inline_s_u8t_mt);
137140
}
138141

139142
pop.close();

tests/radix_tree/radix_concurrent_erase.cpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ static size_t INITIAL_ELEMENTS = 512;
1414
* erase all elements and read them from the other threads. */
1515
static void
1616
test_erase_find(nvobj::pool<root> &pop,
17-
nvobj::persistent_ptr<container_string> &ptr)
17+
nvobj::persistent_ptr<container_string_mt> &ptr)
1818
{
1919
const size_t value_repeats = 1000;
2020
size_t threads = 4;
@@ -26,7 +26,7 @@ test_erase_find(nvobj::pool<root> &pop,
2626

2727
auto erase_f = [&] {
2828
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
29-
ptr->erase(key<container_string>(i));
29+
ptr->erase(key<container_string_mt>(i));
3030
ptr->garbage_collect();
3131
}
3232
};
@@ -38,11 +38,11 @@ test_erase_find(nvobj::pool<root> &pop,
3838
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
3939
w.critical([&] {
4040
auto res = ptr->find(
41-
key<container_string>(i));
41+
key<container_string_mt>(i));
4242
UT_ASSERT(
4343
res == ptr->end() ||
4444
res->value() ==
45-
value<container_string>(
45+
value<container_string_mt>(
4646
i,
4747
value_repeats));
4848
});
@@ -57,8 +57,9 @@ test_erase_find(nvobj::pool<root> &pop,
5757

5858
ptr->runtime_finalize_mt();
5959

60-
nvobj::transaction::run(
61-
pop, [&] { nvobj::delete_persistent<container_string>(ptr); });
60+
nvobj::transaction::run(pop, [&] {
61+
nvobj::delete_persistent<container_string_mt>(ptr);
62+
});
6263

6364
UT_ASSERTeq(num_allocs(pop), 0);
6465
}
@@ -67,7 +68,7 @@ test_erase_find(nvobj::pool<root> &pop,
6768
* Concurrently try to read this element from other threads */
6869
static void
6970
test_write_erase_find(nvobj::pool<root> &pop,
70-
nvobj::persistent_ptr<container_string> &ptr)
71+
nvobj::persistent_ptr<container_string_mt> &ptr)
7172
{
7273
const size_t value_repeats = 1000;
7374
size_t threads = 8;
@@ -79,9 +80,10 @@ test_write_erase_find(nvobj::pool<root> &pop,
7980

8081
auto writer_f = [&] {
8182
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
82-
ptr->emplace(key<container_string>(0),
83-
value<container_string>(0, value_repeats));
84-
ptr->erase(key<container_string>(0));
83+
ptr->emplace(
84+
key<container_string_mt>(0),
85+
value<container_string_mt>(0, value_repeats));
86+
ptr->erase(key<container_string_mt>(0));
8587
ptr->garbage_collect();
8688
}
8789
};
@@ -93,11 +95,11 @@ test_write_erase_find(nvobj::pool<root> &pop,
9395
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
9496
w.critical([&] {
9597
auto res = ptr->find(
96-
key<container_string>(0));
98+
key<container_string_mt>(0));
9799
UT_ASSERT(
98100
res == ptr->end() ||
99101
res->value() ==
100-
value<container_string>(
102+
value<container_string_mt>(
101103
0,
102104
value_repeats));
103105
});
@@ -111,8 +113,9 @@ test_write_erase_find(nvobj::pool<root> &pop,
111113

112114
ptr->runtime_finalize_mt();
113115

114-
nvobj::transaction::run(
115-
pop, [&] { nvobj::delete_persistent<container_string>(ptr); });
116+
nvobj::transaction::run(pop, [&] {
117+
nvobj::delete_persistent<container_string_mt>(ptr);
118+
});
116119

117120
UT_ASSERTeq(num_allocs(pop), 0);
118121
}
@@ -123,7 +126,7 @@ test_write_erase_find(nvobj::pool<root> &pop,
123126
* deleting and reading elements */
124127
static void
125128
test_garbage_collection(nvobj::pool<root> &pop,
126-
nvobj::persistent_ptr<container_string> &ptr)
129+
nvobj::persistent_ptr<container_string_mt> &ptr)
127130
{
128131
const size_t value_repeats = 1000;
129132
size_t threads = 8;
@@ -139,7 +142,7 @@ test_garbage_collection(nvobj::pool<root> &pop,
139142
if (id == 0) {
140143
/* deleter */
141144
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
142-
ptr->erase(key<container_string>(i));
145+
ptr->erase(key<container_string_mt>(i));
143146

144147
if (i % 50 == 0) {
145148
syncthreads();
@@ -154,11 +157,11 @@ test_garbage_collection(nvobj::pool<root> &pop,
154157
for (size_t i = 0; i < INITIAL_ELEMENTS; ++i) {
155158
w.critical([&] {
156159
auto res = ptr->find(
157-
key<container_string>(i));
160+
key<container_string_mt>(i));
158161
UT_ASSERT(
159162
res == ptr->end() ||
160163
res->value() ==
161-
value<container_string>(
164+
value<container_string_mt>(
162165
i,
163166
value_repeats));
164167
});
@@ -177,8 +180,9 @@ test_garbage_collection(nvobj::pool<root> &pop,
177180

178181
ptr->runtime_finalize_mt();
179182

180-
nvobj::transaction::run(
181-
pop, [&] { nvobj::delete_persistent<container_string>(ptr); });
183+
nvobj::transaction::run(pop, [&] {
184+
nvobj::delete_persistent<container_string_mt>(ptr);
185+
});
182186

183187
UT_ASSERTeq(num_allocs(pop), 0);
184188
}
@@ -201,9 +205,9 @@ test(int argc, char *argv[])
201205
UT_FATAL("!pool::create: %s %s", pe.what(), path);
202206
}
203207

204-
test_erase_find(pop, pop.root()->radix_str);
205-
test_write_erase_find(pop, pop.root()->radix_str);
206-
test_garbage_collection(pop, pop.root()->radix_str);
208+
test_erase_find(pop, pop.root()->radix_str_mt);
209+
test_write_erase_find(pop, pop.root()->radix_str_mt);
210+
test_garbage_collection(pop, pop.root()->radix_str_mt);
207211

208212
pop.close();
209213
}

0 commit comments

Comments
 (0)