Page 2 of 3

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 16:23
by John Doe

Latest post of the previous page:

Уже несколько раз сталкиваюсь с ошибкой, возникающей после запуска процесса поиска (вызванного по AltF7):

Code: Select all

   ╔═══════════════════════════════════════════════════ Error ════════════════════════════════════════════════════╗
   ║ C:\Apps\Far3\Plugins\LuaMacro\LuaMacro.dll:                                                                  ║
   ║ C:\Apps\Far3\Profile\Macros\scripts\Menu\MenuAutoFilter.lua:87: attempt to index local 'param' (a nil value) ║
   ║ stack traceback:                                                                                             ║
   ║    C:\Apps\Far3\Profile\Macros\scripts\Menu\MenuAutoFilter.lua:87: in function 'condition'                   ║
   ║    C:\Apps\Far3\Plugins\LuaMacro\utils.lua:148: in function <C:\Apps\Far3\Plugins\LuaMacro\utils.lua:141>    ║
   ║    [C]: in function 'FileExists'                                                                             ║
   ║    ...pps\Far3\Profile\Macros\scripts\PickPathFromOtherFAR.lua:20: in function <...pps\Far3\Profile\Macros\  ║
   ║ scripts\PickPathFromOtherFAR.lua:18>                                                                         ║
   ╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
   ║                                                    { OK }                                                    ║
   ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Повторяется нестабильно.

Место ошибки - MenuAutoFilter.lua, обработчик диалогового события condition=function(Event,param).
param здесь по документации таблица, и я не пойму откуда может взяться nil.

И вторая непонятная для меня вещь, это третий уровень стека [C]: in function 'FileExists' (PickPathFromOtherFAR.lua)
Здесь FileExists==win.GetFileAttr, и функция вызывается по таймеру с интервалов 50 мс.

Как это всё вообще оказывается в одном стеке мне неясно.

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 16:46
by John Doe
Не знаю насколько это вообще связано, но LuaMacro у меня падает нередко и не выдавая сообщений.
Обычно при поиске, или в процессе скачивания обновления плагином UpdateEx.

Есть ли общие причины у всех разнообразных падений выяснить проблематично, т.к. падает нестабильно.
Но знаю один верный способ: в PickPathFromOtherFAR.lua уменьшить интервал до 1, и запустить поиск.
Падает (или виснет) если не с первой попытки, то со второй или третьей.

P.S.
В логах иногда страшное:

Code: Select all

Exceptiontion in [C:\Apps\Far3\Plugins\LuaMacro\LuaM.alcro.dll] pl
ugin.

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 16:53
by Shmuel
John Doe wrote: Уже несколько раз сталкиваюсь с ошибкой, возникающей после запуска процесса поиска (вызванного по AltF7):
У меня эти макросы не установлены, с их кодом я не знаком, поэтому ничего не могу сказать. Не исключено, что причина связана с тем, что Фар при поиске AltF7 вызывает ProcessDialogEventW плагина из неосновного потока (см. на эту тему комментарий к билду 127 плагина LuaMacro).
John Doe wrote: Не знаю насколько это вообще связано, но LuaMacro у меня падает нередко и не выдавая сообщений.
А вот у меня такого не было ни разу.

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 17:12
by John Doe
Shmuel wrote: У меня эти макросы не установлены, с их кодом я не знаком, поэтому ничего не могу сказать.
Вот выжимка из этих макросов:

Code: Select all

Event { group="DialogEvent";
  condition=function(Event,param)
    local input = param.Param2
  end;
  action=function(Event,param)
  end;
}

Code: Select all

  local taskfile = win.GetEnv"TEMP"..[[\FARTasks\getpaths.task]]
  local FileExists = win.GetFileAttr
  local timer=far.Timer(1,function(timer)
    timer.Enabled = false
    FileExists(taskfile)
    timer.Enabled = true
  end)
  Event { group="ExitFAR"; action=function() timer:Close() end; }
И теперь попробуйте интервал таймера уменьшить до 1. Удаётся завалить плагин?

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 17:27
by Shmuel
1. Хоть разок бы прогнали, прежде чем мне предлагать (taskname -- taskfile)
2. Не указано, откуда запускается второй кусок кода. Я запускаю файл с комстроки - ничего не происходит, в т.ч. при установке интервала таймера в 1.

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 17:33
by John Doe
Я исправил код, но как выяснилось опоздал (
Оба куска можно объединить в одном файле, загружаемом из scripts.

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

Edit
3.0.4260 x86 из ночных сборок, с единственным плагином, и единственным скриптом тоже падает.

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 17:46
by Shmuel
Запускал поиск раз 20, как маленький, так и большой (~ 50000 файлов). Никаких падений. Попробовал также изменить имя файла 'taskfile' на существующий у меня - ничего не изменилось.

LuaMacro — Lua как язык макросов

Posted: Mon 02 Feb, 2015 18:02
by Shmuel
John Doe wrote: 3.0.4260 x86 из ночных сборок, с единственным плагином, и единственным скриптом тоже падает.
Попробовал и это - не падает.

Допускаю, что падать может. В своё время была сделана защита на OpenW, а защита на ProcessSynchroEventW (используемую таймером LuaFAR) сделана не была.

Мне кажется более правильным исправлением было бы, чтобы Фар не вызывал экспортируемые функции плагинов из разных потоков в одно и то же время (точнее, с перекрытием по времени).

Ради интереса, попробуйте вариант плагина с защитой на ProcessSynchroEventW.
LuaMacro.dll.7z
(16.53 KiB) Downloaded 103 times

LuaMacro — Lua как язык макросов

Posted: Tue 03 Feb, 2015 10:13
by John Doe
Shmuel wrote: Запускал поиск раз 20, как маленький, так и большой (~ 50000 файлов).
У меня падает сразу же после начала поиска.
Подозреваю что в момент нахождения первого файла, т.к. при этом в списке найденного ещё ничего нет, но кнопки уже разблокированы.
Shmuel wrote:Попробовал также изменить имя файла 'taskfile' на существующий у меня - ничего не изменилось.
В моём случае файла не существует.
Shmuel wrote: Ради интереса, попробуйте вариант плагина с защитой на ProcessSynchroEventW
Этот тоже удалось пару раз завалить, но падает намного реже.

LuaMacro — Lua как язык макросов

Posted: Tue 03 Feb, 2015 10:15
by John Doe
А что можно предположить по поводу ошибки индексирования param?

Code: Select all

Event { group="DialogEvent";
  condition=function(Event,param)
    local input = param.Param2
  end;
  action=function(Event,param)
  end;
}
(С обсуждаемыми выше падениями это не связано, падает без этого обработчика)

LuaMacro — Lua как язык макросов

Posted: Tue 03 Feb, 2015 10:25
by Shmuel
Покуда у меня не появится воспроизводимый test-case, практически не о чем говорить.
Попозже попробую ещё поиграться на Windows 7.

LuaMacro — Lua как язык макросов

Posted: Wed 04 Feb, 2015 22:50
by Shmuel
Воспроизводимый test-case у меня появился. Для этого достаточно было в макрофайл вставить far.SubscribeDialogDrawEvents(true). Стало часто падать при поиске AltF7. Но с той luamacro.dll, которая выложена несколькими постами выше, пока ни разу не упало.

LuaMacro — Lua как язык макросов

Posted: Thu 05 Feb, 2015 10:13
by John Doe
Shmuel wrote: Стало часто падать при поиске AltF7.
Ещё одно падучее место — диалог плагина UpdateEx, после нажатия Download.
Сейчас попробовал, и там практически сразу воспроизвелась проблема, о которой я писал выше: в обработчик DialogEvent не пришли параметры (т.е. Event==nil и param==nil)

LuaMacro — Lua как язык макросов

Posted: Thu 05 Feb, 2015 10:38
by Shmuel
Причина ясна: Фар вызывает экспортируемые функции (или одну и ту же функцию, ProcessDialogEventW) одного и того же плагина из разных потоков, не дожидаясь возврата плагина из предыдущего вызова. Сам Фар категорически запрещает плагинам делать подобное. Я рассматриваю это, как баг Фара, место которому - на мантисе.

Чинить надо Find File

Posted: Fri 06 Feb, 2015 10:40
by John Doe

Чинить надо Find File

Posted: Mon 16 Apr, 2018 16:53
by 2useven10
Аналогичная ситуация с acrlite
Из 2-х потоков зовётся GetOpenPanelInfoW и падает при одновременном изменении стринга.
Имеет ли смысл ставить защиту в плагине (в этой ф-и или во всех эксортируемых) или можно ждать починки поиска?