Skip to content

BronsonAVLTreeMap segfaults #167

@bnicolae

Description

@bnicolae

Here's a test program that reproduces this issue

#include <omp.h>

#include <vector>
#include <map>
#include <random>
#include <iostream>

#include <cds/init.h>
#include <cds/urcu/general_buffered.h>
#include <cds/container/bronson_avltree_map_rcu.h>

using namespace cds::container;
typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_gpb;

typedef std::pair<int, int> intp_t;
static std::vector<intp_t> ref_vals;
static std::map<int, int> sorted_vals;
static const int N = 1000000;

using namespace cds::container;
typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_gpb;

void create_reference(int n) {
    std::mt19937 rng(112233L);
    ref_vals.resize(n);
    sorted_vals.clear();
    int i = 0;
    while (i < n) {
        int val = rng();
        auto it = sorted_vals.find(val);
        if (it != sorted_vals.end())
            continue;
        auto p = std::make_pair(val, val + 1);
        sorted_vals.insert(it, p);
        ref_vals[i] = p;
        i++;
    }
    std::cout << "Init complete, max element: " << sorted_vals.rbegin()->first + 1 << std::endl;
}

int main() {
    cds::Initialize();
    rcu_gpb rcuGPB;

    BronsonAVLTreeMap<rcu_gpb, int, int> map;
    create_reference(N);
    int t = std::thread::hardware_concurrency();
    #pragma omp parallel num_threads(t)
    {
        cds::threading::Manager::attachThread();
        #pragma omp for
        for (int i = 0; i < N; i++)
            map.insert(ref_vals[i].first, ref_vals[i].second);
        cds::threading::Manager::detachThread();
    }
    cds::Terminate();
    return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions