OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 21 Июнь, 2025 19:30

Часовой пояс: UTC + 3 часа




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

Зарегистрирован: Четверг, 27 Сентябрь, 2007 21:43
Сообщения: 10
Откуда: Киев, Украина
Здравствуйте, недавно я начал изучать 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.
Для предотвращения этого нужно либо запретить выгрузку модулей вообще, либо ввести что-то вроде "сборщика мусора для модулей".


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Я в таких случаях делаю так:
Код:
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;


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


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

Зарегистрирован: Четверг, 27 Сентябрь, 2007 21:43
Сообщения: 10
Откуда: Киев, Украина
Цитата:
но корректную выгрузку обеспечивает

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


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
evslusar писал(а):
не всегда : в памяти могут остаться объекты, созданные с помощью
A.dir. Что бы решить проблему в общем, придется добавлять отслеживание этих связей в рантайм

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


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

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Неявные связи модулей
СообщениеДобавлено: Воскресенье, 30 Сентябрь, 2007 10:22 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, это именно недоработка...
Потому что проследить перед попыткой выгрузки модуля наличие в памяти экземпляров объектов из него элементарно.
И если объекты с поведением, то просто запретить выгрузку (если без поведения, то можно позволить, т.к. секция описаний модуля после выгрузки всё равно остаётся в памяти).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB