OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 18:46

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 25 Февраль, 2020 14:51 
Модератор
Аватара пользователя

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Предложение: ввести Kernel.GetLoaderHook
СообщениеДобавлено: Вторник, 25 Февраль, 2020 18:19 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Илья Ермаков писал(а):
Это нужно, например, если вы используете обработку факта загрузки модуля.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Предложение: ввести Kernel.GetLoaderHook
СообщениеДобавлено: Вторник, 25 Февраль, 2020 18:41 
Модератор
Аватара пользователя

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Предложение: ввести Kernel.GetLoaderHook
СообщениеДобавлено: Вторник, 25 Февраль, 2020 21:27 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Уточню: Триггеры предполагаются в сторонних модулях? (потому как если бы в загружаемом, то вы бы все нужное сделали в BEGIN/CLOSE, верно?)

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Предложение: ввести Kernel.GetLoaderHook
СообщениеДобавлено: Вторник, 25 Февраль, 2020 23:17 
Модератор
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Предложение: ввести Kernel.GetLoaderHook
СообщениеДобавлено: Вторник, 25 Февраль, 2020 23:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
adimetrius писал(а):
2) у Д.В.Дагаева подглядел PROCEDURE ThisKernelVar со ссылкой на Евгения Темиргалеева - вполне себе настоящий хак :D ; взял себе на вооружение.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Предложение: ввести Kernel.GetLoaderHook
СообщениеДобавлено: Среда, 26 Февраль, 2020 20:29 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Перепутал название. Она в модуле 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 я ее к себе "импортировал", слегка обобщив.


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

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


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

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


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

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