From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail From: Natasha Kerensikova Newsgroups: comp.lang.ada Subject: Re: Should weak counted reference be able to be strengthened? Date: Sat, 22 Nov 2014 09:57:05 +0000 (UTC) Organization: A noiseless patient Spider Message-ID: References: <7d9r3whe43z8$.1f2l3n5cz0zh0$.dlg@40tude.net> <1h5a33dishpky.8m2rngmy7e7x$.dlg@40tude.net> Injection-Date: Sat, 22 Nov 2014 09:57:05 +0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="76a49b86bc3e16725b7cfca3d85cb4c8"; logging-data="608"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18LCMpHq6AUiKGhLk63P5/C" User-Agent: slrn/1.0.1 (FreeBSD) Cancel-Lock: sha1:nr8dcbvRTcvywaFB/etq8I8RKCw= Xref: news.eternal-september.org comp.lang.ada:23636 Date: 2014-11-22T09:57:05+00:00 List-Id: On 2014-11-21, Dmitry A. Kazakov wrote: >>>>>> As a side note, I'm a bit surprised by how easy weak/strong reference >>>>>> seem to be: I think I would only need to store two counters instead of >>>>>> one, one for the strong references and one for all references, >>>>>> deallocating the object when the strong reference counter reaches >>>>>> zero, and freeing the counters when the total counter reaches zero -- as >>>>>> if each weak reference was a strong reference to the counters. Then it's >>>>>> only a matter of adding an atomic increase-if-not-zero to the strong >>>>>> reference counter to build accessors from weak references. >>>>>> Is there a subtle trap I'm missing? >>>> >>>> [...] >> >> In the example in the innermost quote, there is no direct notification, >> in that there is no way to run arbitrary code when the referred object >> disappear. However the information about object disappearance is >> accessible to the weak reference: whenever the strong reference count is >> zero, > > The reference count is a part of the object. When the object is gone, there > is no reference count. > > Of course, you could add some levels of indirection to keep counters off > the objects, but then you would have serious problems, e.g. like Ada tasks > have when allocated and deallocated dynamically. Having the counters separate from the object is actually the defining point of implementation, and the only reason it exists in the first place: generic type Held_Data (<>) is limited priavte; package Natools.References is [...] private type Data_Access is access Held_Data; type Counter_Access is access Counter; type Reference is new Ada.Finalization.Controlled with record Count : Counter_Access := null; Data : Data_Acess := null; end record; end Natools.References; As far as I understand, this makes it possible to instantiate with literally any Ada type, except incomplete ones. This makes it useful in a niche not covered by any other implementation (that I know of). However, what are the serious problems I'm supposed to have? I have used this implementation with task types, but I have yet to encounter any. Natasha