Изучаем DISPOSABLE

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Изучаем DISPOSABLE

Сообщение БудДен » 23.09.21 22:53

Ищем DisposableЛи/isDisposable, а также смотрим такой пример кода:

Код: Выделить всё

MODULE Proba;

(* Proba.Do ~ *)
VAR m: POINTER {UNSAFE, UNTRACED, DISPOSABLE} TO ARRAY 5 OF INTEGER;

PROCEDURE Do*(); 
BEGIN
(* NEW(m); *)
DISPOSE(m);
END Do;

END Proba.
Он компилируется, но потом пытается вызвать Runtime.Dispose и на этом падает. Сборщик мусора не следит за Disposable объектами, а само слово испольузется в кооперативной версии, в модуле Activities (там, кстати, есть и модуль Runtime.Mod, а в нём -

Код: Выделить всё

(** This procedure releases memory that was previously acquired by a call to the [[Runtime.New]] procedure. *)
(** The compiler implements DISPOSE statements on types marked as disposable with a call to this procedure. *)
PROCEDURE Dispose- (VAR pointer {UNTRACED}: BaseTypes.Pointer);
...
Дальнейшее изучение показывает, что всё это на вид выглядит работающим.

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

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Изучаем DISPOSABLE

Сообщение БудДен » 26.09.21 13:21

Лис, спасибо за конструктивный подход. Что касается варианта с маршалингом, в ЯОС пока что только одно адресное пространство, поэтому он недоступен.

Ответить