Boost logo

Boost :

Subject: Re: [boost] [fusion] sequence io manipulators
From: Jeff Flinn (Jeffrey.Flinn_at_[hidden])
Date: 2013-03-26 13:03:02


On 3/25/2013 9:33 PM, Joel de Guzman wrote:
> On 3/26/13 3:12 AM, Jeff Flinn wrote:
>> When streaming unrelated fusion sets to unrelated ostringstreams from
>> different threads, I
>> get an invalid iterator error. This appears to be due to using a
>> boost::fusion::detail::stream_data::attach's local static arena instance.
>>
>> static void attach(Stream& stream, T const& data)
>> {
>> static arena ar; // our arena
>> ar.data.push_back(new T(data));
>> stream.pword(get_xalloc_index<Tag>()) = ar.data.back();
>> }
>>
>> I assume there are issues with using the unguarded stream_data::data
>> std::vector<T*> from
>> multiple threads. This implementation looks problematic in that the
>> arena data does not
>> get cleaned up until program exit as well.
>
> Right. That code is quite old, IIRC inherited from Boost.Tuples. Would you
> care to provide a patch?

Joel,

See Ticket# 8336 with it's attached patch.

I've compiled/linked/ran on VS2012 32bit and gcc4.2 32bit on Mac OSX
10.7. My app tests concurrent streaming. I have not added any such tests
to fusion as I assume you do not want dependencies on thread library.

I have not addressed possible issues with "static int index =
std::ios::xalloc();" thread safety. gcc at least appears to guard this
initialization with a mutex. I'm not sure what the standard guarantees
in this regard pre/post C++11. Comments would be appreciated.

Thanks, Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk