OberonCore https://forum.oberoncore.ru/ |
|
Почему ожидание через пустой цикл? https://forum.oberoncore.ru/viewtopic.php?f=22&t=6679 |
Страница 1 из 1 |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 14:15 ] |
Заголовок сообщения: | Почему ожидание через пустой цикл? |
В процедуре Modules.GetProcedure происходит ожидание загрузки модуля, в котором должна быть процедура, если такой модуль не загружен ещё. Почему это сделано так: Код: IF ~module.init THEN t := Machine.GetTimer(); WHILE ~module.init & (Machine.GetTimer() - t < ModuleInitTimeout) DO END; IF ~module.init THEN (* timeout has expired *) RETURN; END; END; Ведь есть же Kernel.Timer, у него есть Sleep. А также есть AWAIT. Про AWAIT я ещё могу предположить, что он не сможет ощутить таймаут. А почему Sleep не использована? |
Автор: | Sergej Durmanov [ Воскресенье, 22 Ноябрь, 2020 14:55 ] |
Заголовок сообщения: | Re: Почему бесконечный цикл? |
Здесь нет бесконечного цикла. |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 15:09 ] |
Заголовок сообщения: | Re: Почему ожидание через пустой цикл? |
Семантическая очепятка. |
Автор: | Sergej Durmanov [ Воскресенье, 22 Ноябрь, 2020 15:37 ] |
Заголовок сообщения: | Re: Почему ожидание через пустой цикл? |
Для работы A2 достаточно 4 псевдомодуля ( псевдомодуль, потому что реально это может быть разбито на более мелкие модули ): 1) минимальная абстракция над железом, 2) управление памятью, 3) управление модулями, 4) управление активными объектами. Теоретически, это 4 модуля Machine, Heaps, Modules, Objects. Это минимально необходимый рантайм для языка Активный Оберон. И здесь не применяются языковые блокировки и механизмы синхронизации. Используются свои блокировки через глобальный спинлок. Модуль Kernel это прослойка между ядром и вышележащей системой, он находится выше, ядро не может( и не должно) его использовать, и он, в целом, не является обязательным. А сейчас в нём почти ничего и нет. |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 15:49 ] |
Заголовок сообщения: | Re: Почему ожидание через пустой цикл? |
Спасибо, понял. Возможно, что те, кому нужно что-то иное, могут обеспечить, чтобы модуль был загружен, сами, до вызова GetProcedure. |
Автор: | Sergej Durmanov [ Воскресенье, 22 Ноябрь, 2020 15:56 ] |
Заголовок сообщения: | Re: Почему ожидание через пустой цикл? |
Вообще-то, к этому моменту модуль уже загружен. Но может быть еще не инициализирован. Именно завершения инициализации (в случае необходимости ) цикл и ожидает. На цпу с частотой 1Gz цикл ожидания не превысит трех секунд, но инициализация явно завершится раньше)), так что ждать не придется |
Автор: | Sergej Durmanov [ Воскресенье, 22 Ноябрь, 2020 16:04 ] |
Заголовок сообщения: | Re: Почему ожидание через пустой цикл? |
Эту процедуру не нужно вызывать самостоятельно. Есть предопределенная процедура GETPROCEDURE |
Автор: | budden [ Воскресенье, 22 Ноябрь, 2020 17:48 ] |
Заголовок сообщения: | Re: Почему ожидание через пустой цикл? |
Да, я не совсем разобрался в том, что там происходит. Даже если мы ждём инициализации, которая, если я правильно понял, запускает код между BEGIN и END, то она может делать что угодно и сколь угодно долго, и мы будем до 3 секунд молотить этот пустой цикл. Насчёт GETPROCEDURE - нужно бы посмотреть, как она работает. На самом деле в том коде, к-рый я сейчас трогал (а это код отладчика от Богдана Т + реализация главного меню), есть своя хакерская GetProcedure, дающая доступ к коду любой процедуры, независимо от сигнатуры. Я стал сравнивать её с Modules.GetProcedure и увидел этот цикл. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |