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/ |