<p>Am 27.01.2016 23:41 schrieb "Maciej Izak" <<a href="mailto:hnb.code@gmail.com">hnb.code@gmail.com</a>>:<br>
><br>
> 2016-01-27 17:24 GMT+01:00 Sven Barth <<a href="mailto:pascaldragon@googlemail.com">pascaldragon@googlemail.com</a>>:<br>
>><br>
>> I'll need to look at your code again, but even for class functions the same rules (and worries) as for normal methods apply.<br>
><br>
> I hope that your research in Generics.Defaults will be successful for manual interfaces :P<br>
><br>
> Most important about manual interfaces, and why can't be used any other solution without painful consequences:<br>
><br>
> 1. we don't want to use ARC interfaces (for singletons created at startup in Generics.Defaults)<br>
> side note: in Generics.Defaults is introduced TSingletonImplementation for non ARC COM interfaces</p>
<p>Why not? This would solve the whole problem below. Also you can create them lazily, so not every instance would need to be available from the start on...</p>
<p>> 2. even if point 1. is simple to achieve, it brings a lot of problems because we need to keep somewhere our singletons and that means:<br>
><br>
> SIGSEGV exception is guaranteed, during closing application in many scenarios<br>
><br>
> program X;<br>
> uses<br>
>   A, B;<br>
> begin end.<br>
><br>
> A source code:<br>
><br>
> unit A; interface uses Contnrs; <br>
>   var GarbageCollector: Contnrs.TObjectList;  <br>
> implementation initialization<br>
>   GarbageCollector := Contnrs.TObjectList.Create(true);<br>
> finalization<br>
>   GarbageCollector.Free;<br>
> end.<br>
><br>
> in B is used A and Generics.Collections.<br>
><br>
> unit B; interface uses A, Generics.Collections; implementation<br>
> begin<br>
>   GarbageCollector.Add(TDictionary.Create);<br>
> end.<br>
><br>
> Generics.Collections (which is using Generics.Defaults) and our Generics.Defaults is released before A. It will cause a memory violation in Generics.Defaults for our singleton O__o.<br>
><br>
> To avoid this memory violation is necessary to omit point 1.<br>
><br>
> 3. To avoid memory violation, any instance of collection should be owner of instance of IComparer / IEqualityComparer and that is performance and memory killer in comparison to manual interfaces.</p>
<p>Why would each collection instance need to contain an instance of the comparer? They don't contain state and are reentrant, so they can be easily shared with ARC singletons.</p>
<p>Note: there would either need to be a global variable for each instance or a list that gets automatically finalized as well (e.g. as a stupid implementation an array of IInterface). Then if Generics.Defaults is finalized before the other unit using it only the reference count will be decreased and only when the other unit is finalized the comparer will be destroyed.</p>
<p>Regards,<br>
Sven</p>