Skip to content

Commit 1a507ce

Browse files
committed
bug fix
1 parent b8dc5ca commit 1a507ce

File tree

1 file changed

+27
-25
lines changed

1 file changed

+27
-25
lines changed

src/cc_sketch_alg.cpp

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -588,43 +588,45 @@ void CCSketchAlg::filter_sf_edges(SpanningForest &sf) {
588588
size_t start = partition.first;
589589
size_t end = partition.second;
590590

591-
// check if we collide with previous thread. If so lock and apply those updates.
592-
if (start > 0 && edges[start].src == edges[start - 1].src) {
593-
sketches[edges[start].src]->mutex.lock();
594-
size_t orig_start = start;
595-
while (start < end && edges[start].src == edges[orig_start].src) {
596-
Edge edge = edges[start];
597-
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
598-
++start;
591+
if (start != end) {
592+
// check if we collide with previous thread. If so lock and apply those updates.
593+
if (start > 0 && edges[start].src == edges[start - 1].src) {
594+
sketches[edges[start].src]->mutex.lock();
595+
size_t orig_start = start;
596+
while (start < end && edges[start].src == edges[orig_start].src) {
597+
Edge edge = edges[start];
598+
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
599+
++start;
600+
}
601+
602+
sketches[edges[orig_start].src]->mutex.unlock();
599603
}
600604

601-
sketches[edges[orig_start].src]->mutex.unlock();
602-
}
605+
// check if we collide with next thread. If so lock and apply those updates.
606+
if (end > start && end < edges.size() && edges[end - 1].src == edges[end].src) {
607+
sketches[edges[end - 1].src]->mutex.lock();
608+
size_t orig_end = end;
609+
while (end > start && edges[end - 1].src == edges[orig_end - 1].src) {
610+
Edge edge = edges[end - 1];
611+
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
612+
--end;
613+
}
603614

604-
// check if we collide with next thread. If so lock and apply those updates.
605-
if (end > start && end < edges.size() && edges[end - 1].src == edges[end].src) {
606-
sketches[edges[end - 1].src]->mutex.lock();
607-
size_t orig_end = end;
608-
while (edges[end - 1].src == edges[orig_end - 1].src) {
609-
Edge edge = edges[end - 1];
610-
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
611-
--end;
615+
sketches[edges[orig_end].src]->mutex.unlock();
612616
}
613617

614-
sketches[edges[orig_end].src]->mutex.unlock();
615-
}
616-
617-
for (size_t i = start; i < end; i++) {
618-
Edge edge = edges[i];
619-
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
618+
for (size_t i = start; i < end; i++) {
619+
Edge edge = edges[i];
620+
sketches[edge.src]->update(static_cast<vec_t>(concat_pairing_fn(edge.src, edge.dst)));
621+
}
620622
}
621623
}
622624

623625
// delete_time += std::chrono::steady_clock::now() - start;
624626
}
625627

626628
std::vector<SpanningForest> CCSketchAlg::calc_disjoint_spanning_forests(size_t k) {
627-
std::cout << "Spanning forests query begins. Number of updates = " << num_updates.load() << std::endl;
629+
std::cout << "Spanning forests query. Number of updates = " << num_updates.load() << std::endl;
628630

629631
// sf_query_start = std::chrono::steady_clock::now();
630632
std::vector<SpanningForest> SFs;

0 commit comments

Comments
 (0)