std.container.BinaryHeap + refCounted = WTF???

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Nov 16 13:47:56 PST 2010


On 11/16/10 12:47 PM, dsimcha wrote:
> I'm trying to use BinaryHeap in a multithreaded programming using
> std.parallelism/parallelfuture.  I kept getting ridiculous segfaults and
> stuff, and when I looked into it in a debugger, I realized the crashes had to
> do with reference counting, probably caused by this line in BinaryHeap:
>
>      private RefCounted!(Tuple!(Store, "_store", size_t, "_length"),
>                         RefCountedAutoInitialize.no) _payload;
>
> Why the heck are the payload and the length being stored in such a weird way?
>   IMHO BinaryHeap shouldn't use reference counting unless Store does.  More
> generally, anything that uses reference counting, especially where unexpected,
> should come with a very strong warning in its ddoc so that people are aware of
> the hidden caveats, like copying it using memcpy() and sharing it across threads.

BinaryHeap being a container it has reference semantics. In order to 
also be sealed, it needs to be reference counted. The fact that the 
store uses itself reference counting is not relevant because BinaryHeap 
has two fields.

Andrei


More information about the Digitalmars-d mailing list