OberonCore
https://forum.oberoncore.ru/

#029 Предложение: ввести Kernel.GetLoaderHook
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6567
Страница 1 из 1

Автор:  Илья Ермаков [ Вторник, 25 Февраль, 2020 14:51 ]
Заголовок сообщения:  #029 Предложение: ввести Kernel.GetLoaderHook

Сейчас есть SetLoaderHook, но получить установленный хук (чтобы обернуть его и переустановить) нельзя.

Это нужно, например, если вы используете обработку факта загрузки модуля. Сейчас приходится выковыривать установленный хук через Meta.

Есть предложение ввести для симметрии GetLoaderHook или сделать его экспортированным на чтение.

Да, есть слабое место в том, что нет способа симметрично отловить выгрузку модуля. Но пока можно остановиться на половинчатом решении, если не проектировать события от ядра (типа на выгрузку модулей, перед сборкой мусора и т.п.).

Автор:  adimetrius [ Вторник, 25 Февраль, 2020 18:19 ]
Заголовок сообщения:  Re: Предложение: ввести Kernel.GetLoaderHook

Илья Ермаков писал(а):
Это нужно, например, если вы используете обработку факта загрузки модуля.

А для чего, в каких приложениях это нужно?

Автор:  Илья Ермаков [ Вторник, 25 Февраль, 2020 18:41 ]
Заголовок сообщения:  Re: Предложение: ввести Kernel.GetLoaderHook

Для навешивания некоторых действий при загрузке модуля (например, генерации на лету реализации, которая втыкает процедурные переменные в сам модуль).

Сейчас у меня есть вариант:

BEGIN
KrlModBind.Do("ONLOAD")
...

и KrlModBind определяет имя вызывавшего модуля и вызывает команду, записанную в Strings для триггера ONLOAD: ModuleName.ONLOAD.

В принципе, тут есть плюс в явной активации триггера из самого модуля (хотя лишний явный код - повод ошибиться, больше действий в разных местах надо прописать - и в Strings, и в BEGIN и т.п.)

Другие применения:
например, для того, чтобы модуль имел асинхронную активность, можно экспортировать процедуру заданного вида (Loop* (OUT idle: BOOLEAN), например) - и экосистема будет сама втыкать его на цикл обработки.
Меньше однотипного занудного кода внутри модуля, когда он сам должен себя поставить на регистрацию. Его дело - выставить интерфейс, а экосистема уже его подключает, куда надо.

Автор:  adimetrius [ Вторник, 25 Февраль, 2020 21:27 ]
Заголовок сообщения:  Re: Предложение: ввести Kernel.GetLoaderHook

Уточню: Триггеры предполагаются в сторонних модулях? (потому как если бы в загружаемом, то вы бы все нужное сделали в BEGIN/CLOSE, верно?)

Т.е. вам экспорт stdLoaderHook на чтение нужен, чтобы сделать цепочку: ядро вызывает вас, а вы - настоящий загрузчик? Если так, то отчего же не экспортировать; опять же в режиме used internally - никаких жестких обязательств перед потомками.

Но:
1) мне ваше решение с KrlModBind.Do оч нравится. У меня тоже есть процедура, которая позволят узнать, откуда (М.П) "я" вызван(а)

2) у Д.В.Дагаева подглядел PROCEDURE ThisKernelVar со ссылкой на Евгения Темиргалеева - вполне себе настоящий хак :D ; взял себе на вооружение.

Автор:  Илья Ермаков [ Вторник, 25 Февраль, 2020 23:17 ]
Заголовок сообщения:  Re: Предложение: ввести Kernel.GetLoaderHook

Да, реакция на триггер - внешняя.
В приведённом варианте - просто исполнение команды из Strings. Там обычно что-то типа:
SomeImplModule.Use (а он уже втыкает свой dir или hook в модуль, который активировал триггер).
Бывает KrlPlatforms.IfLinuxThen("LinuxImpl.Use"); KrlPlatforms.IfWindowsThen("WindowsImpl.Use");

Решение с явным вызовом триггера тоже хорошо оставить.

Но хотелось бы иметь и возможность внешней обработки события загрузки.

Автор:  Илья Ермаков [ Вторник, 25 Февраль, 2020 23:27 ]
Заголовок сообщения:  Re: Предложение: ввести Kernel.GetLoaderHook

adimetrius писал(а):
2) у Д.В.Дагаева подглядел PROCEDURE ThisKernelVar со ссылкой на Евгения Темиргалеева - вполне себе настоящий хак :D ; взял себе на вооружение.


А где эта процедура?

Автор:  adimetrius [ Среда, 26 Февраль, 2020 20:29 ]
Заголовок сообщения:  Re: Предложение: ввести Kernel.GetLoaderHook

Перепутал название. Она в модуле Ta_STAreas, Ta_DisAreas

Код:
   (*- 20111223, ТЕЭ, средство для установки правильного значения Kernel.baseStack из ПО,       
   использующего динамическую библиотеку *)
   PROCEDURE SetKernelBaseStack* (x: INTEGER);
      VAR
         m: Kernel.Module;
         ref, adr: INTEGER; mode, form: SHORTCHAR; desc: Kernel.Type; name: Kernel.Utf8Name;
   BEGIN
      m := Kernel.modList;
      WHILE (m # NIL) & ~(m.name = "Kernel") DO
         m := m.next
      END;
      ASSERT(m # NIL, 90);
      ref := m.refs; Kernel.GetRefProc(ref, adr, name); ASSERT(adr # 0, 91);
      Kernel.GetRefVar(ref, mode, form, desc, adr, name);
      WHILE (mode = 1X) & ~(name = "baseStack") DO
         Kernel.GetRefVar(ref, mode, form, desc, adr, name)
      END;
      ASSERT(mode = 1X, 92); ASSERT(form = 6X, 93);
      SYSTEM.PUT(m.data + adr, x)
   END SetKernelBaseStack;

Под именем ThisKernelVar я ее к себе "импортировал", слегка обобщив.

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