Skip to content

Commit 039ac77

Browse files
authored
Merge pull request #4413 from danpoe/refactor/sharing-map
Sharing map refactorings
2 parents d61900d + 468717f commit 039ac77

File tree

6 files changed

+162
-121
lines changed

6 files changed

+162
-121
lines changed

src/util/sharing_map.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ class sharing_mapt
350350

351351
std::size_t count_unmarked_nodes(
352352
bool leafs_only,
353-
std::set<void *> &marked,
353+
std::set<const void *> &marked,
354354
bool mark = true) const;
355355

356356
// dummy element returned when no element was found
@@ -423,8 +423,10 @@ ::iterate(
423423
}
424424

425425
SHARING_MAPT(std::size_t)
426-
::count_unmarked_nodes(bool leafs_only, std::set<void *> &marked, bool mark)
427-
const
426+
::count_unmarked_nodes(
427+
bool leafs_only,
428+
std::set<const void *> &marked,
429+
bool mark) const
428430
{
429431
if(empty())
430432
return 0;
@@ -447,8 +449,10 @@ ::count_unmarked_nodes(bool leafs_only, std::set<void *> &marked, bool mark)
447449

448450
// internal node or container node
449451
const innert *ip = static_cast<const innert *>(bp);
450-
const unsigned use_count = ip->data.use_count();
451-
void *raw_ptr = ip->data.get();
452+
const unsigned use_count = ip->use_count();
453+
const void *raw_ptr = ip->is_internal()
454+
? (const void *)&ip->read_internal()
455+
: (const void *)&ip->read_container();
452456

453457
if(use_count >= 2)
454458
{
@@ -488,8 +492,8 @@ ::count_unmarked_nodes(bool leafs_only, std::set<void *> &marked, bool mark)
488492

489493
for(const auto &l : ll)
490494
{
491-
const unsigned leaf_use_count = l.data.use_count();
492-
void *leaf_raw_ptr = l.data.get();
495+
const unsigned leaf_use_count = l.use_count();
496+
const void *leaf_raw_ptr = &l.read();
493497

494498
if(leaf_use_count >= 2)
495499
{
@@ -528,7 +532,7 @@ ::get_sharing_stats(
528532
Iterator end,
529533
std::function<sharing_mapt &(const Iterator)> f)
530534
{
531-
std::set<void *> marked;
535+
std::set<const void *> marked;
532536
sharing_map_statst sms;
533537

534538
// We do a separate pass over the tree for each statistic. This is not very

src/util/sharing_node.h

Lines changed: 78 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ class sharing_node_baset
105105
SN_TYPE_PAR_DEF class sharing_node_innert : public sharing_node_baset
106106
{
107107
public:
108+
typedef small_shared_two_way_ptrt<SN_PTR_TYPE_ARGS> datat;
109+
typedef typename datat::use_countt use_countt;
110+
108111
typedef d_internalt<SN_TYPE_ARGS> d_it;
109112
typedef d_containert<SN_TYPE_ARGS> d_ct;
110113

@@ -113,18 +116,18 @@ SN_TYPE_PAR_DEF class sharing_node_innert : public sharing_node_baset
113116
typedef typename d_ct::leaft leaft;
114117
typedef typename d_ct::leaf_listt leaf_listt;
115118

116-
sharing_node_innert() : data(empty_data)
119+
sharing_node_innert()
117120
{
118121
}
119122

120123
bool empty() const
121124
{
122-
return data == empty_data;
125+
return !data;
123126
}
124127

125128
void clear()
126129
{
127-
data = empty_data;
130+
data.reset();
128131
}
129132

130133
bool shares_with(const sharing_node_innert &other) const
@@ -134,6 +137,11 @@ SN_TYPE_PAR_DEF class sharing_node_innert : public sharing_node_baset
134137
return data == other.data;
135138
}
136139

140+
use_countt use_count() const
141+
{
142+
return data.use_count();
143+
}
144+
137145
void swap(sharing_node_innert &other)
138146
{
139147
data.swap(other.data);
@@ -151,45 +159,13 @@ SN_TYPE_PAR_DEF class sharing_node_innert : public sharing_node_baset
151159
return data.is_derived_v();
152160
}
153161

154-
d_it &write_internal()
155-
{
156-
if(data == empty_data)
157-
{
158-
data = make_shared_derived_u<SN_PTR_TYPE_ARGS>();
159-
}
160-
else if(data.use_count() > 1)
161-
{
162-
data = make_shared_derived_u<SN_PTR_TYPE_ARGS>(*data.get_derived_u());
163-
}
164-
165-
SN_ASSERT(data.use_count() == 1);
166-
167-
return *data.get_derived_u();
168-
}
169-
170162
const d_it &read_internal() const
171163
{
172164
SN_ASSERT(!empty());
173165

174166
return *data.get_derived_u();
175167
}
176168

177-
d_ct &write_container()
178-
{
179-
if(data == empty_data)
180-
{
181-
data = make_shared_derived_v<SN_PTR_TYPE_ARGS>();
182-
}
183-
else if(data.use_count() > 1)
184-
{
185-
data = make_shared_derived_v<SN_PTR_TYPE_ARGS>(*data.get_derived_v());
186-
}
187-
188-
SN_ASSERT(data.use_count() == 1);
189-
190-
return *data.get_derived_v();
191-
}
192-
193169
const d_ct &read_container() const
194170
{
195171
SN_ASSERT(!empty());
@@ -338,13 +314,41 @@ SN_TYPE_PAR_DEF class sharing_node_innert : public sharing_node_baset
338314
SN_ASSERT_USE(r, r == 1);
339315
}
340316

341-
small_shared_two_way_ptrt<SN_PTR_TYPE_ARGS> data;
342-
static small_shared_two_way_ptrt<SN_PTR_TYPE_ARGS> empty_data;
343-
};
317+
protected:
318+
d_it &write_internal()
319+
{
320+
if(!data)
321+
{
322+
data = make_shared_derived_u<SN_PTR_TYPE_ARGS>();
323+
}
324+
else if(data.use_count() > 1)
325+
{
326+
data = make_shared_derived_u<SN_PTR_TYPE_ARGS>(*data.get_derived_u());
327+
}
344328

345-
SN_TYPE_PAR_DEF small_shared_two_way_ptrt<SN_PTR_TYPE_ARGS>
346-
sharing_node_innert<SN_TYPE_ARGS>::empty_data =
347-
small_shared_two_way_ptrt<SN_PTR_TYPE_ARGS>();
329+
SN_ASSERT(data.use_count() == 1);
330+
331+
return *data.get_derived_u();
332+
}
333+
334+
d_ct &write_container()
335+
{
336+
if(!data)
337+
{
338+
data = make_shared_derived_v<SN_PTR_TYPE_ARGS>();
339+
}
340+
else if(data.use_count() > 1)
341+
{
342+
data = make_shared_derived_v<SN_PTR_TYPE_ARGS>(*data.get_derived_v());
343+
}
344+
345+
SN_ASSERT(data.use_count() == 1);
346+
347+
return *data.get_derived_v();
348+
}
349+
350+
datat data;
351+
};
348352

349353
// Leafs
350354

@@ -362,9 +366,12 @@ SN_TYPE_PAR_DECL class d_leaft : public small_shared_pointeet<unsigned>
362366
SN_TYPE_PAR_DEF class sharing_node_leaft : public sharing_node_baset
363367
{
364368
public:
369+
typedef small_shared_ptrt<SN_PTR_TYPE_ARG> datat;
370+
typedef decltype(datat().use_count()) use_countt;
371+
365372
typedef d_leaft<SN_TYPE_ARGS> d_lt;
366373

367-
sharing_node_leaft(const keyT &k, const valueT &v) : data(empty_data)
374+
sharing_node_leaft(const keyT &k, const valueT &v)
368375
{
369376
SN_ASSERT(empty());
370377

@@ -384,45 +391,27 @@ SN_TYPE_PAR_DEF class sharing_node_leaft : public sharing_node_baset
384391

385392
bool empty() const
386393
{
387-
return data == empty_data;
394+
return !data;
388395
}
389396

390397
void clear()
391398
{
392-
data = empty_data;
399+
data.reset();
393400
}
394401

395402
bool shares_with(const sharing_node_leaft &other) const
396403
{
397404
return data == other.data;
398405
}
399406

400-
void swap(sharing_node_leaft &other)
407+
use_countt use_count() const
401408
{
402-
data.swap(other.data);
403-
}
404-
405-
d_lt &write()
406-
{
407-
SN_ASSERT(data.use_count() > 0);
408-
409-
if(data == empty_data)
410-
{
411-
data = make_small_shared_ptr<d_lt>();
412-
}
413-
else if(data.use_count() > 1)
414-
{
415-
data = make_small_shared_ptr<d_lt>(*data);
416-
}
417-
418-
SN_ASSERT(data.use_count() == 1);
419-
420-
return *data;
409+
return data.use_count();
421410
}
422411

423-
const d_lt &read() const
412+
void swap(sharing_node_leaft &other)
424413
{
425-
return *data;
414+
data.swap(other.data);
426415
}
427416

428417
// Accessors
@@ -452,12 +441,29 @@ SN_TYPE_PAR_DEF class sharing_node_leaft : public sharing_node_baset
452441
return write().v;
453442
}
454443

455-
small_shared_ptrt<SN_PTR_TYPE_ARG> data;
456-
static small_shared_ptrt<SN_PTR_TYPE_ARG> empty_data;
457-
};
444+
const d_lt &read() const
445+
{
446+
return *data;
447+
}
458448

459-
SN_TYPE_PAR_DEF small_shared_ptrt<SN_PTR_TYPE_ARG>
460-
sharing_node_leaft<SN_TYPE_ARGS>::empty_data =
461-
make_small_shared_ptr<SN_PTR_TYPE_ARG>();
449+
protected:
450+
d_lt &write()
451+
{
452+
if(!data)
453+
{
454+
data = make_small_shared_ptr<d_lt>();
455+
}
456+
else if(data.use_count() > 1)
457+
{
458+
data = make_small_shared_ptr<d_lt>(*data);
459+
}
460+
461+
SN_ASSERT(data.use_count() == 1);
462+
463+
return *data;
464+
}
465+
466+
datat data;
467+
};
462468

463469
#endif

src/util/small_shared_two_way_ptr.h

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -101,30 +101,13 @@ class small_shared_two_way_ptrt final
101101

102102
~small_shared_two_way_ptrt()
103103
{
104-
if(!p)
105-
{
106-
return;
107-
}
108-
109-
auto use_count = p->use_count();
104+
destruct();
105+
}
110106

111-
if(use_count == 1)
112-
{
113-
if(p->is_derived_u())
114-
{
115-
U *u = static_cast<U *>(p);
116-
delete u;
117-
}
118-
else
119-
{
120-
V *v = static_cast<V *>(p);
121-
delete v;
122-
}
123-
}
124-
else
125-
{
126-
p->decrement_use_count();
127-
}
107+
void reset()
108+
{
109+
destruct();
110+
p = nullptr;
128111
}
129112

130113
void swap(small_shared_two_way_ptrt &rhs)
@@ -186,6 +169,34 @@ class small_shared_two_way_ptrt final
186169
}
187170

188171
private:
172+
void destruct()
173+
{
174+
if(!p)
175+
{
176+
return;
177+
}
178+
179+
auto use_count = p->use_count();
180+
181+
if(use_count == 1)
182+
{
183+
if(p->is_derived_u())
184+
{
185+
U *u = static_cast<U *>(p);
186+
delete u;
187+
}
188+
else
189+
{
190+
V *v = static_cast<V *>(p);
191+
delete v;
192+
}
193+
}
194+
else
195+
{
196+
p->decrement_use_count();
197+
}
198+
}
199+
189200
pointeet *p = nullptr;
190201
};
191202

unit/util/sharing_map.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ void sharing_map_sharing_stats_test()
385385
{
386386
SECTION("count nodes")
387387
{
388-
std::set<void *> marked;
388+
std::set<const void *> marked;
389389
smt sm;
390390
int count = 0;
391391

@@ -410,7 +410,7 @@ void sharing_map_sharing_stats_test()
410410

411411
SECTION("marking")
412412
{
413-
std::set<void *> marked;
413+
std::set<const void *> marked;
414414
smt sm;
415415

416416
fill(sm);

0 commit comments

Comments
 (0)