Boost logo

Geometry :

Subject: Re: [geometry] rtree crash when used with inter process
From: gongyiling_boost (gongyiling_boost_at_[hidden])
Date: 2014-05-24 03:53:48


>> >Hi,
>>
>> >Fractal wrote:
>> >> Hi all
>> >> rtree is a great library?I used it in my project, everything is ok except random crash after I updated program bin file.
>> >> i dig into the source code of rtree,found the crash was caused by using virtual function at node class. I also found that there is a static version of node class. is this a to be implement feature, or I'm using rtree in the wrong way?
>> here is the minimal example which exhibit the problem, you run the program the first time, is ok, but the second time, it crashed in insert method,
>> i'm using vs2012, and the os is win7, in linux version, i observed that only i recompile my program and restart it, will it crash.

>Yes, indeed the polymorphic nodes are the cause of this crash. So from
>now on Boost.Variant-based nodes are used by default in the rtree:
>https://github.com/boostorg/geometry/commit/3474244d0a91d63752cd8a7b683fd013da030750
>The side effects (according to the
>index/example/benchmark_experimental.cpp) are:
>- slower inserts on MSVC
>- faster inserts on GCC
>- smaller memory consumption
>I plan to rewrite and optimize the nodes dispatching in the future when
>I have more free time, for now the above should do the job.

>If you can use the development branch of the library, just get the
>latest version of Boost or Boost.Geometry from GitHub.

>If you need a workaround for a previously released version of Boost you
>may do exactly the same changes I've made directly in the library or
>write something like this:

>#include <boost/geometry.hpp>
>#include <boost/geometry/index/rtree.hpp>

>struct my_linear_tag {};

>namespace boost { namespace geometry { namespace index { namespace
>detail { namespace rtree {

>template <>
>struct options_type<my_linear_tag>
>{
> typedef options<
> index::linear<32, 8>,
> insert_default_tag,
> choose_by_content_diff_tag,
> split_default_tag,
> linear_tag,
> node_s_mem_static_tag
> > type;
>};

>}}}}}// namespace boost::geometry::index::detail::rtree

>// ...

>typedef bgi::rtree<rtree_value_type, my_linear_tag, indexable_t,
>equal_to_t, rtree_allocator_t> rtree_t;

>Let me know if one of the solutions works for you.
that's great! Adam, i tried all the solutions you mentioned above, the my_linear_tag method failed to compile the insert method, compiler complains:D:\boost\boost_1_54_0\boost/geometry/index/rtree.hpp(1048): error C2664: ¡°boost::geometry::index::detail::rtree::visitors::insert<Element,Value,Options,Translator,Box,Allocators,InsertTag>::insert(boost::interprocess::offset_ptr<PointedType,DifferenceType,OffsetType,OffsetAlignment> &,size_t &,const Value &,const boost::geometry::index::linear<MaxElements,MinElements> &,const Translator &,Allocators &,size_t)¡±: cannot convert parameter 5 from ¡°params_t¡± to ¡°const boost::geometry::index::linear<MaxElements,MinElements> &¡±then i modified the boost/geometry/index/detail/rtree/options.hpp according to github, and it worked perfectly!thanks Adam.



Geometry list run by mateusz at loskot.net