OberonCore
https://forum.oberoncore.ru/

Неявные связи модулей
https://forum.oberoncore.ru/viewtopic.php?f=1&t=667
Страница 1 из 1

Автор:  evslusar [ Четверг, 27 Сентябрь, 2007 23:08 ]
Заголовок сообщения:  Неявные связи модулей

Здравствуйте, недавно я начал изучать BlackBox, и вот возник такой вопрос :
Предположим, что у нас есть модуль, экспортирующий абстрактный
тип и абстрактную же фабрику для этого типа :
Код:
MODULE A;

TYPE
      AbsRec* = POINTER TO ABSTRACT RECORD
      END;
      
      AbsDirectory* = POINTER TO ABSTRACT RECORD
      END;
      
VAR
      dir- : AbsDirectory;
      
      PROCEDURE (a : AbsRec) Method*, NEW, ABSTRACT;
      PROCEDURE (a : AbsDirectory) NewRec*(VAR r : AbsRec), NEW, ABSTRACT;
      
      PROCEDURE SetDir*(newDir : AbsDirectory);
      BEGIN
            dir := newDir
      END SetDir;
      
      PROCEDURE UseAbsRec*;
      VAR
            r : AbsRec;
      BEGIN
            dir.NewRec(r);
            r.Method
      END UseAbsRec;
      
      
END A.


И мы написали модуль реализации :
Код:
MODULE B;

IMPORT A, StdLog;

TYPE
      Rec = POINTER TO RECORD(A.AbsRec)
      END;
      
      Directory* = POINTER TO RECORD(A.AbsDirectory)
      END;
      
VAR
      dir : Directory;
      
      PROCEDURE (a : Rec) Method;
      BEGIN
            StdLog.Ln; StdLog.String("Hi, I'm Rec.Method!")
      END Method;
      
      PROCEDURE (a : Directory) NewRec*(VAR r : A.AbsRec);
      VAR
            nr : Rec;
      BEGIN
            NEW(nr);
            r := nr
      END NewRec;
      
      PROCEDURE Register*;
      BEGIN
            A.SetDir(dir)
      END Register;
      
BEGIN
      NEW(dir)
END B.


Вроде бы всё нормально : если вызвать команды B.Register и A.UseAbsRec, в лог будет выведено "Hi, I'm Rec.Method!". Но модуль
A будет использовать тип из модуля B (тип B.Directory), хотя система об этом ничего не знает. Если далее вызвать DevDebug.Unload "B", модуль B спокойно выгрузится, т. к. явных ссылок на него нет, и переменная A.dir окажется невалидной, и попытка её использовать
(напр., A.UseAbsRec), приведёт к trap'у illegal execution.
Для предотвращения этого нужно либо запретить выгрузку модулей вообще, либо ввести что-то вроде "сборщика мусора для модулей".

Автор:  Иван Горячев [ Пятница, 28 Сентябрь, 2007 01:39 ]
Заголовок сообщения:  Re: Неявные связи модулей

Я в таких случаях делаю так:
Код:
MODULE A;
...
VAR
  dir-, stdDir- : Directory;

PROCEDURE RemoveDir* (d : Directory);
BEGIN
  IF d = dir THEN dir := stdDir END
END RemoveDir;
...
END A;

Код:
MODULE B;
...
CLOSE
  A.RemoveDir (dir)
END B;


Хотя всех проблем это не решает (нельзя перезагрузить модуль с сохранением его данных в памяти), но корректную выгрузку обеспечивает. Правда со стандартными модулями ББ такое не прокатывает :(

Автор:  evslusar [ Пятница, 28 Сентябрь, 2007 02:21 ]
Заголовок сообщения:  Re: Неявные связи модулей

Цитата:
но корректную выгрузку обеспечивает

не всегда : в памяти могут остаться объекты, созданные с помощью
A.dir. Что бы решить проблему в общем, придется добавлять отслеживание этих связей в рантайм

Автор:  Иван Горячев [ Пятница, 28 Сентябрь, 2007 06:57 ]
Заголовок сообщения:  Re: Неявные связи модулей

evslusar писал(а):
не всегда : в памяти могут остаться объекты, созданные с помощью
A.dir. Что бы решить проблему в общем, придется добавлять отслеживание этих связей в рантайм

А, это да. Только рантаймом лечится. Без этого, действительно, говорить о свободной выгрузке модулей не приходится.

Автор:  Vlad [ Воскресенье, 30 Сентябрь, 2007 00:38 ]
Заголовок сообщения:  Re: Неявные связи модулей

evslusar писал(а):
Если далее вызвать DevDebug.Unload "B", модуль B спокойно выгрузится, т. к. явных ссылок на него нет, и переменная A.dir окажется невалидной, и попытка её использовать
(напр., A.UseAbsRec), приведёт к trap'у illegal execution.
Для предотвращения этого нужно либо запретить выгрузку модулей вообще, либо ввести что-то вроде "сборщика мусора для модулей".


По-моему это банальная бага/недоработка рантайма BB. Не должен он давать выгружать модуль, если существуют ссылки на его сущности (процедуры). Или по крайней мере нормально диагностировать такую ситуацию (а не банальный трап фиг знает из-за чего).

Автор:  Илья Ермаков [ Воскресенье, 30 Сентябрь, 2007 10:22 ]
Заголовок сообщения:  Re: Неявные связи модулей

Да, это именно недоработка...
Потому что проследить перед попыткой выгрузки модуля наличие в памяти экземпляров объектов из него элементарно.
И если объекты с поведением, то просто запретить выгрузку (если без поведения, то можно позволить, т.к. секция описаний модуля после выгрузки всё равно остаётся в памяти).

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/