PhantomReference: можно ли обойтись?
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.06.20 04:03
Оценка: +2
Прочитав http://tooslowexception.com/do-we-need-jvms-phantomreference-in-net/, не понял одного: почему нельзя построить аналогичное решение на чистых WeakReference-ах?
То есть делаем вот такую штуку:
public abstract class PhantomReference<T>
{
   private WeakReference<T> _reference
   public PhantomReference(T reference, IFinalizationQueue<T> queue)
   {
     _reference = new WeakReference<T>(reference ?? throw new ArgumentNullException(nameof(reference)));
     (queue ?? throw new ArgumentNullException(nameof(queue)).Add(this);
   }
   public bool IsDead()
   {
     T _;
     return !_reference.TryGetTarget(out _);
   }
   public abstract void Finalize();
}

Ну и дальше как бы всё то же самое.
public class SafeHandleReference: PhantomReference<SafeHandle>
{
   private IntPtr _handle;
   public SafeHandleReference(SafeHandle handle): base(handle, SafeHandleQueue.MainInstance) =>
     _handle = handle.GetHandle();

   public override void Finalize() => System.FreeHandle(_handle);
}

Вроде бы всё как надо — оживить ссылку нельзя, просохатить событие — тоже негде; полная свобода выбора момента финализации.
Например, можно встроить вызовы очистки SafeHandleQueue.MainInstance во всякие методы классов в System.IO — чтобы периодически освобождать утекающие ссылки.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: PhantomReference: можно ли обойтись?
От: hi_octane Беларусь  
Дата: 15.06.20 14:16
Оценка:
S>Вроде бы всё как надо — оживить ссылку нельзя, просохатить событие — тоже негде; полная свобода выбора момента финализации.
Да, похоже можно и так. Но там автор, как мне показалось, больше мечтает о неком event'е что "такой-то объект всё". Мог бы GC такое событие генерировать, мог бы WeakReference или SafeHandle вызывать виртуальный метод, и было бы ему щасте.
Re[2]: PhantomReference: можно ли обойтись?
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.06.20 14:25
Оценка:
Здравствуйте, hi_octane, Вы писали:
_>Да, похоже можно и так. Но там автор, как мне показалось, больше мечтает о неком event'е что "такой-то объект всё".
Ну так это оно и есть.
_>Мог бы GC такое событие генерировать, мог бы WeakReference или SafeHandle вызывать виртуальный метод, и было бы ему щасте.
Ну всегда можно помечтать о невозможном. Но PhantomReference в Java евентов не отправляет, а его реализация (вроде бы) возможна без доработки рантайма.
Там, кстати, ayende по соседству представил свой вариант — на основе WeakReferenceTable.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.