what to do with postblit on the heap?

Jose Armando Garcia jsancio at gmail.com
Mon Jun 20 15:21:43 PDT 2011


On Mon, Jun 20, 2011 at 7:12 PM, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> On Mon, 20 Jun 2011 16:45:44 -0400, Michel Fortin
> <michel.fortin at michelf.com> wrote:
>> On 2011-06-20 10:34:14 -0400, "Steven Schveighoffer" <schveiguy at yahoo.com>
>> said:
>>
>>> I have submitted a fix for bug 5272,
>>>  http://d.puremagic.com/issues/show_bug.cgi?id=5272 "Postblit not called on
>>>  copying due to array append"
>>>  However, I am starting to realize that one of the major reasons for
>>>  postblit is to match it with an equivalent dtor.
>>>  This works well when the struct is on the stack -- the posblit for
>>>  instance increments a reference counter, then the dtor decrements the ref
>>>  counter.
>>>  But when the data is on the heap, the destructor is *not* called.  So
>>> what  happens to any ref-counted data that is on the heap?  It's never
>>>  decremented.  Currently though, it might still work, because postblit
>>>  isn't called when the data is on the heap!  So no increment, no decrement.
>>>  I think this is an artificial "success".  However, if the pull request I
>>>  initiated is accepted, then postblit *will* be called on heap allocation,
>>>  for instance if you append data.  This will further highlight the fact
>>>  that the destructor is not being called.
>>>  So is it worth adding calls to postblit, knowing that the complement
>>>  destructor is not going to be called?  I can see in some cases where it
>>>  would be expected, and I can see other cases where it will be difficult to
>>>  deal with.  IMO, the difficult cases are already broken anyways, but it
>>>  just seems like they are not.
>>>  The other part of this puzzle that is missing is array assignment, for
>>>  example a[] = b[] does not call postblits.  I cannot fix this because
>>>  _d_arraycopy does not give me the typeinfo.
>>>  Anyone else have any thoughts?  I'm mixed as to whether this patch
>>> should  be accepted without more comprehensive GC/compiler reform.  I feel
>>> its a  step in the right direction, but that it will upset the balance in a
>>> few  places (particularly ref-counting).
>>
>> My feeling is that array appending and array assignment should be
>> considered a compiler issue first and foremost. The compiler needs to be
>> fixed, and once that's done the runtime will need to be updated anyway to
>> match the changes in the compiler. Your proposed fix for array assignment is
>> a good start for when the compiler will provide the necessary info to the
>> runtime, but applying it at this time will just fix some cases by breaking a
>> few others: net improvement zero.
>
> BTW, I now feel that your request to make a distinction between move and
> copy is not required.  The compiler currently calls the destructor of
> temporaries, so it should also call postblit.  I don't think it can make the
> distinction between array appending and simply calling some other function.
>
> If the issue of array assignment is fixed, do you think it's worth putting
> the change in, and then filing a bug against the GC?  I still think the
> current cases that "work" are fundamentally broken anyways.
>
> For instance, in a ref-counted struct, if you appended it to an array, then
> removed all the stack-based references, the ref count goes to zero, even
> though the array still has a reference (I think someone filed a bug against
> std.stdio.File for this).
>
>> As for the issue that destructors aren't called for arrays on the heap,
>> it's a serious problem. But it's also a separate problem that concerns
>> purely the runtime, as far as I am aware of. Is there someone working on it?
>
> I think we need precise scanning to get a complete solution.  Another option
> is to increase the information the array runtime stores in the memory block
> (currently it only stores the "used" length) and then hook the GC to call
> the dtors.  This might be a quick fix that doesn't require precise scanning,
> but it also fixes the most common case of allocating a single struct or an
> array of structs on the heap.
>
> -Steve
>

Also, I don't think this problem is specific to array. I think that
AAs are also not calling postblit and dtor. In one of my project I
have an AA to what essentially is a RefCounted and it doesn't increase
the ref count.


More information about the Digitalmars-d mailing list