[serialization] Problem with multiple multi-index keys.

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[serialization] Problem with multiple multi-index keys.

Toby Smith
Hi,

I'm having a problem serializing a multi-index container.  Serialization
used to work fine, until I added a second (non-unique) key to the
container.  I've managed to distill the problem down to a small bit of
code, so here it is.  Uncomment the #define to see the segfault at
serialization time in action, leave it commented and the example code
works fine.  I'm clearly missing something subtle (or not-so-subtle) here,
but I don't have the first clue what it might be.  Suggestions are
enormously appreciated.

Regards,
tob


----------------------------------------------------------------------------
// A simple program to illustrate my crazy serialization problem with
// multi-index containers.  Compiled with:
// g++ -I/usr/local/include/boost-1_33_1/ boost_test.c++ \
// -lboost_serialization -o boost_test
//
// When two keys are specified for FooSet, serialization segfaults.  When
// only one key is present, we're fine.  Uncomment the line below to see
// the segfault in action.

// #define KILL_SERIALIZATION

#include <fstream>
#include <string>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>

struct Foo
{
    Foo() : _id(0) { }
    Foo(unsigned id) : _id(id) { }

    unsigned _id;
    std::string _name;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
        ar & _id;
        ar & _name;
    }
};

// Container for class Foo
struct foo_id_tag { };
struct foo_name_tag { };

typedef boost::multi_index_container<
    Foo,
    boost::multi_index::indexed_by<
        boost::multi_index::ordered_unique<
            boost::multi_index::tag<foo_id_tag>,
            BOOST_MULTI_INDEX_MEMBER(Foo, unsigned, _id)
#if defined(KILL_SERIALIZATION)
        >,
        boost::multi_index::ordered_non_unique<
            boost::multi_index::tag<foo_name_tag>,
            BOOST_MULTI_INDEX_MEMBER(Foo, std::string, _name)
#endif
        >
    >
> FooSet;

void save(const FooSet& fooSet)
{
    std::ofstream ofs("foo");
    boost::archive::text_oarchive oa(ofs);
    oa << fooSet;
}

int main(int argc, char** argv)
{
    FooSet foo_set;

    foo_set.insert(Foo(100));
    foo_set.insert(Foo(150));

    save(foo_set);

    return 0;
}
_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: [serialization] Problem with multiple multi-index keys.

Joaquin M LópezMuñoz
Hello Tob,

Toby Smith ha escrito:

> Hi,
>
> I'm having a problem serializing a multi-index container.  Serialization
> used to work fine, until I added a second (non-unique) key to the
> container.  I've managed to distill the problem down to a small bit of
> code, so here it is.  Uncomment the #define to see the segfault at
> serialization time in action, leave it commented and the example code
> works fine.  I'm clearly missing something subtle (or not-so-subtle) here,
> but I don't have the first clue what it might be.

You're not missing anything, rather you have found a bug in Boost.MultiIndex.
Could you please replace line 80 in
boost/multi_index/detail/duplicates_iterator.hpp

    if(pred(begin_chunk->value,node->value))advance();

with the following:

    if(node!=end&&pred(begin_chunk->value(),node->value()))advance();

and check out if this is fixing the problem in your original code? (The snippet
you sent I have already checked out.) I'll be commiting this change to the
CVS shortly, thank you very much for spotting the problem and reporting
about it.

Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo



_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: [serialization] Problem with multiple multi-index keys.

Toby Smith
Hi Joaquin,

I rebuilt our full project with this fix, and everything's working  
perfectly again.

Thanks so much for the quick investigation and response!

Best regards,
tob


On Jan 31, 2006, at 3:47 AM, Joaquín Mª López Muñoz wrote:

> Hello Tob,
>
> Toby Smith ha escrito:
>
>> Hi,
>>
>> I'm having a problem serializing a multi-index container.  
>> Serialization
>> used to work fine, until I added a second (non-unique) key to the
>> container.  I've managed to distill the problem down to a small  
>> bit of
>> code, so here it is.  Uncomment the #define to see the segfault at
>> serialization time in action, leave it commented and the example code
>> works fine.  I'm clearly missing something subtle (or not-so-
>> subtle) here,
>> but I don't have the first clue what it might be.
>
> You're not missing anything, rather you have found a bug in  
> Boost.MultiIndex.
> Could you please replace line 80 in
> boost/multi_index/detail/duplicates_iterator.hpp
>
>     if(pred(begin_chunk->value,node->value))advance();
>
> with the following:
>
>     if(node!=end&&pred(begin_chunk->value(),node->value()))advance();
>
> and check out if this is fixing the problem in your original code?  
> (The snippet
> you sent I have already checked out.) I'll be commiting this change  
> to the
> CVS shortly, thank you very much for spotting the problem and  
> reporting
> about it.
>
> Joaquín M López Muñoz
> Telefónica, Investigación y Desarrollo
>
>
>
> _______________________________________________
> Boost-users mailing list
> [hidden email]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>


_______________________________________________
Boost-users mailing list
[hidden email]
http://lists.boost.org/mailman/listinfo.cgi/boost-users