draft proposal for ref counting in D
Walter Bright
newshound2 at digitalmars.com
Wed Oct 9 19:15:38 PDT 2013
On 6/27/2013 1:15 PM, Michel Fortin wrote:
> Le 27-juin-2013 à 15:32, Walter Bright a écrit :
>
>> On 6/27/2013 11:38 AM, Michel Fortin wrote:
>>>> 14. RC objects will still be allocated on the GC heap - this means that a
normal
>>>> GC run will reap RC objects that are in a cycle, and RC objects will get
automatically
>>>> scanned for heap references with no additional action required by the user.
>>> If you allocate the object from the GC heap, the GC will collect it
regardless of its reference count. That's fine as long as all the retaining
pointers are visible to the GC. But if you're defining a COM object, likely
that's because you'll pass a pointer to an external API, and this API might
store the pointer somewhere not scanned by the GC. This API will call AddRef to
make sure the object is retained, but if the GC doesn't see that pointer on its
heap it'll deallocate and next time external code uses the object everything
goes boom! So that doesn't work.
>> We already require that if you're going to pass a pointer to any GC
allocated data to external code, that you retain a pointer. I see no additional
issue with requiring this for COM objects created on the GC heap.
>
> Perhaps it's just me, but I'd say if you need to anticipate the duration for
which you need to keep the object alive when you pass it to some external code
it completely defeats the purpose of said external code calling AddRef and Release.
>
> With the scheme you propose, reference counting would be useful inside D code
as a way to deallocate some classes of objects early without waiting a GC scan.
The GC can collect cycles for those objects.
>
> People passing COM objects to external code however should allocate those
objects outside of the GC if they intend to pass the object to external code.
They should also add member pointers as GC roots. Also, no cycle detection for
those objects. If done right it could be made memory safe, but cycles will leak.
>
> Maybe that could work.
>
Nothing about the proposal acts to prevent one from constructing COM objects any
way they wish, including using malloc/free and managing it all themselves. All
COM objects require is an implementation of the COM interface, which says
nothing at all beyond having a pointer to an AddRef() and Release().
If you are building a COM object that is to be fired and forgotten into the void
of unknown external code, I don't think there's any automated replacement for
thinking carefully about it and constructing it accordingly. D's memory safety
guarantees cannot, of course, cover unknown and unknowable external code.
What I'm trying to accomplish with this proposal is:
1. A way to do ref-counted memory allocation for specific objects
2. Do it in a guaranteed memory safe manner (at least for the user of those objects)
3. Do it in a way that does not interfere with people who want to use the GC or
do manual memory management
4. Not impose penalties on non-refcounted code
5. Do it in a way that offers a similar performance and overhead profile to
C++'s shared_ptr<T>
6. Do it in a way that makes it usable to construct COM objects, and work with
NSObject's
7. Not require pointer annotations
8. Address the most common "why I can't use D" complaint
What I'm not trying to accomplish is:
1. Replacing all memory allocation in D with ref counting
More information about the Digitalmars-d
mailing list