far.Timer и сборка мусора

Здесь обсуждается всё, что касается макросов.
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Latest post of the previous page:

SUSim, я какое-то время не смогу обсуждать вопросы по существу, надеюсь что через несколько дней смогу.
User avatar
SUSim
Posts: 1735
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 15 times
Been thanked: 45 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by SUSim »

НОРМАЛЬНО. сам иногда сильно офлайн бываю...
Ничего страшного не случилось %)
Last edited by SUSim on Mon 20 Jan, 2025 18:23, edited 1 time in total.
SimSU ··· ·· -- ··· ··-
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Снова о far.Timer. Не нашёл нового, более приемлемого решения.
Итак, на данный момент 2 варианта: старый и новый (который от 19 января).

Старый:
Имеет описанную в предыдущих постах проблему неудаления таймеров и сопутствующего им кода при перезагрузке макросов.
Эту проблему макрописатель может предотвратить путём:
1) присвоения возвращаемых хэндлов таймера локальным переменным верхнего уровня макрофайла, и
2) закрытием этих хэндлов в обработчике ExitFAR.

Новый:
Не имеет проблемы старого варианта, но имеет проблему удаления таймеров сборщиком мусора.
Эта проблема решается пунктом (1) решения для старого варианта, пункт (2) не нужен.

Дилемма: оставить новый или откатить на старый вариант? Или что-то третье?
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by zg »

я за второй вариант, в нём помимо всего последствия ошибочного кода локализованы во времени и «пространстве».
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Если выбирать из двух, то новый.

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

1а. По-старому, но автоматически сохранять ссылки на объекты таймеры, и при перезагрузке закрывать принудительно.

2а. По-новому, но защищать от преждевременной сборки мусора, автоматически сохраняя ссылки на объекты.
При перезагрузке не только удалять ссылки, но ещё
и принудительно закрывать (или collectgarbage).
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

John Doe, оба ваши варианта мне кажутся заточенными на LuaMacro и (видимо) предполагают обёртку (wrapper) вокруг far.Timer, позволяющую вклиниваться в вызов far.Timer и куда-то сохранять возвращённый хэндл. Думал об этом, но хотелось решения в LuaFAR, а не в конкретном плагине LuaMacro.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Shmuel wrote: Tue 21 Jan, 2025 21:07 хотелось решения в LuaFAR, а не в конкретном плагине LuaMacro.
Что если far.Timer безо всяких врапперов будет сохранять ссылки на созданные таймеры где-нибудь в Registry (а закрытые удалять).

Тогда Luamacro сможет использовать эти ссылки для закрытия таймеров, и ровно то же сможет делать произвольный LuaFar-плагин; соответствующие действия могут быть также предусмотрены в процедурах, перезагружающих скрипт плагина (забыл как команды называются).

P.S.
Чтобы не приходилось руками лазить в Registry, можно было бы вынести это в команду типа far.TimerCloseAll.
Last edited by John Doe on Tue 21 Jan, 2025 22:41, edited 1 time in total.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

John Doe wrote: Tue 21 Jan, 2025 22:32 Чтобы не приходилось руками лазить в Registry, можно было бы вынести это в команду типа far.TimerCloseAll.
Лазить в Registry руками это подразумевается библиотека debug?
far.TimerCloseAll - у нас уже есть far.FreeSettings из той же оперы.
Видимо у меня за последние годы склад ума изменился (не факт, что в лучшую сторону), или вкусы изменились, но больше подобного не хочется.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Shmuel wrote: Tue 21 Jan, 2025 23:30 Лазить в Registry руками это подразумевается библиотека debug?
Да.
Как по мне тоже нормальное решение, этим подчёркивается, что это сугубо внутренние дела, а не часть API.

Можно и не в Registry хранить, а скажем, в far.timers, но тогда это надо будет документировать.
Shmuel wrote: Tue 21 Jan, 2025 23:30 но больше подобного не хочется.
Что вы имеете ввиду?
Last edited by John Doe on Wed 22 Jan, 2025 00:03, edited 1 time in total.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

John Doe wrote: Tue 21 Jan, 2025 23:35 Shmuel писал(а): ↑Ср 22 янв, 2025 01:30
но больше подобного не хочется.

Что вы имеете ввиду?
Механизмы наподобие того, что в far.FreeSettings. Это субъективно, о чём сказал выше.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Есть много путей, и конкретная реализация непринципиальна.
Я исхожу из того что апи должен функционировать максимально предсказуемо, по принципу наименьшего удивления.
В данном случае:
  • при перезагрузке макросов ожидается что и таймеры будут "перезагружены" (а не как раньше)
  • работающий таймер не является мусором, и ситуация, при которой он "самопроизвольно" неожиданно для пользователя прекращает работу не должна быть возможной (а не как сейчас).
Вместо этого, можно конечно добавить в мануал примечания, описывающие не вполне очевидные свойства таймера.
Но зачем, если можно просто сделать их очевидными?
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by buniak_a_h »

Есть нечто общее между таймером и файловым дескриптором. Например, если (локальные) переменные, которым присваивается созданный дескриптор (t=far.Timer или hf=io.open) после выхода из области видимости становятся недоступными, но продолжают "активничать" (таймер вызывает хендлер, файл остаётся занятым и открытым), хотя управление над этими объектами "утеряно" (главное - :close() недоступен). Мне это кажется (и всегда казалось) некорректным. Особенно странно (по поводу таймера), что ситуацию не исправляет перезагрузка макросов! К счастью, файл освобождается.
Итак:
  1. Хотелось бы, чтобы одинаково вели себя оба объекта. Если файл закрывается, то и таймер должен закрываться.
  2. Наверно, было бы удобно (и полезно), если бы велись таблицы открытых таймером, файлов и т.п. ресурсов. Доступ к этим спискам было бы удобно иметь наподобие функции mf.EnumScripts. Тем более я подозреваю, что такие списки внутри FAR-а всё равно ведутся.

Извините, если глупость сморозил. Не со зла.
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

buniak_a_h wrote: Wed 22 Jan, 2025 15:27 хотя управление над этими объектами "утеряно" (главное - :close() недоступен). Мне это кажется (и всегда казалось) некорректным
Но то же самое и в других языках. Если в С/С++ вызвать fopen() и не присвоить возвращаемое значение переменной, не будет доступа к файловым операциям для этого открытого файла.
buniak_a_h wrote: Wed 22 Jan, 2025 15:27 Особенно странно (по поводу таймера), что ситуацию не исправляет перезагрузка макросов!
После коммитов 19 и 21 января такого не должно быть.

Остальное не комментирую. Не потому, что глупость, просто нет времени.
Post Reply

Return to “Обсуждение макросов”