LibCds: Michael Hashmap and Split Order List
Asked Answered
C

1

6

I am using libcds and they have an implementation of Michael Hash Map and Split order list.

Based on the information I gathered from the doc here is how I implemented them:

includes:

#include <cds/map/michael_hash_map.h>
#include <cds/map/split_ordered_list.h>
using namespace cds;

Code:

  class TestDs {
public:
    virtual bool containsKey(int key)=0;
    virtual int get(int key)=0;
    virtual int put(int key, int value)=0;
    virtual int remove(int key)=0;

    virtual int size()=0;
    virtual const char* name()=0;
    virtual void print()=0;
    virtual void shutdown()=0;
};

Code:

class Michael: public TestDs{
private:

    cds::map::MichaelHashMap<int,int,cds::map::pair_traits <int, int>, cds::map::type_traits, CDS_DEFAULT_ALLOCATOR> _ds;
public:
        Michael(const Configuration& config) : _ds(config.initial_count,config.load_factor) {
        }

    bool containsKey(int key) {
        return (_ds.find(key)!=0);
    }

    int get(int key) {
        return _ds.find(key);
    }

    int put(int key, int value) {
        return _ds.insert(key,value);
    }

    int remove(int key) {
        return _ds.erase(key);
    }

    int size() {
        return _ds.size();
    }
    const char* name() {
        return "Micheal";
    }
    void print() {}
    void shutdown() {}

};

And:

class CDSSplit: public TestDs{
private:
    cds::map::SplitOrderedList<int,int,cds::map::pair_traits<int,int> ,cds::map::split_list::type_traits,CDS_DEFAULT_ALLOCATOR> _ds;
public:
    CDSSplit(const Configuration& config) : _ds(config.initial_count, config.load_factor) {
    }

    bool containsKey(int key) {
        return (_ds.find(key)!=0);
    }

    int get(int key) {
        return _ds.find(key);
    }

    int put(int key, int value) {
        return _ds.insert(key,value);
    }

    int remove(int key) {
        return _ds.erase(key);
    }

    int size() {
        return _ds.size();
    }
    const char* name() {
        return "CDSSPlit";
    }
    void print() {}
    void shutdown() {}

};

I initiate the structures by calling:

TestDs* _gTestDs1 = new Michael(_gConfiguration);
TestDs* _gTestDs2 = new CDSSplit(_gConfiguration);

However I get segmentation faults, when CDSSplit is initiated, or when Michael has its first insert performed.

The Library installed fine with no warnings, and I use other hashtables I don't get any errors.

Thanks for any help

(Also posted, with less detail on the discussion page for the library, but there doesn't appear to be much presence there, will post back if anything is posted there)

Compile Flags: -std=c++0x -O3 -msse2 -m32 -DNDEBUG -DINTEL -g -D_REENTRANT -lrt -pthread -fno-strict-aliasing -l cds -l tbb -lllalloc

GDB Output:

    Program received signal SIGSEGV, Segmentation fault.
cds::ordered_list::details::michael_list::implementation<cds::gc::hzp_gc, cds::ordered_list::details::michael_list::adapter<cds::gc::hzp_gc, int, int, cds::map::pair_traits<int, int>, cds::ordered_list::type_traits, std::allocator<int> >, std::allocator<int> >::insert (this=0xafd42028, refHead=..., pNode=0x8440060) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:457
457             position pos( gc_base_class::getGC() )  ;
(gdb) backtrace
#0  cds::ordered_list::details::michael_list::implementation<cds::gc::hzp_gc, cds::ordered_list::details::michael_list::adapter<cds::gc::hzp_gc, int, int, cds::map::pair_traits<int, int>, cds::ordered_list::type_traits, std::allocator<int> >, std::allocator<int> >::insert (this=0xafd42028, refHead=..., pNode=0x8440060) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:457
#1  0x0805323e in insert (this=0x8470070, key=2, value=2) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:430
#2  insert (this=0x8470070, key=2, value=2) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:195
#3  insert (this=0x8470070, key=2, value=2) at /usr/include/cds/map/michael_hash_map.h:487
#4  Michael::put (this=0x8470070, key=2, value=2) at ../test/main.cpp:450
#5  0x0804b129 in FillTable (table_size=5033165) at ../test/main.cpp:876
#6  0x0804c7b2 in RunBenchmark () at ../test/main.cpp:961
#7  0x0804e617 in main (argc=9, argv=0xbffff714) at ../test/main.cpp:846
Convenience answered 9/7, 2011 at 2:3 Comment(2)
Interesting subject. Do you have a minimal working sample that exhibits the problem? I can invent a Configuration class myself, but how do you trigger the segfault?Villainous
The segfault occurs at the creation of the object. You dont need even need to make a config class, the parameters I pass are loadFactor: 60 and initialCount: 8388608. I tried adding the initialization but the error doesn't change.Convenience
V
6

According to the docs, it looks like you are missing the initialization of CDS and the threading manager:

#include <cds/threading/model.h>    // threading manager
#include <cds/gc/hzp/hzp.h>         // Hazard Pointer GC

// ...

int main()
{
    // Initialize CDS library
    cds::Initialize() ;

    // Initialize Garbage collector(s) that you use 
    cds::gc::hzp::GarbageCollector::Construct() ;

    // attach this thread to CDS:
    cds::threading::Manager::attachThread() ;

    // Do some useful work 

    Configuration _gConfiguration;
    TestDs* _gTestDs1 = new Michael(_gConfiguration);
    TestDs* _gTestDs2 = new CDSSplit(_gConfiguration);

    // Terminate GCs 
    cds::gc::hzp::GarbageCollector::Destruct() ;

    // Terminate CDS library
    cds::Terminate()    ;

    return 0;
}
Villainous answered 9/7, 2011 at 23:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.