Сейчас создание и уничтожение экземпляра плагина происходит в функции DllMain. Такое решение имеет несколько проблем:
в точке входа библиотеки можно выполнять ограниченный набор функций WinAPI из-за наличия Loader Lock, поэтому в документации рекомендуют там выполнять только простейшую инициализацию. При расширении/изменении функционала плагина можно нарваться на ограничение
Far не выгружает плагины через FreeLibrary, поэтому DLL_PROCESS_DETACH означает, что Far завершил свою работу и вызвал ExitProcess, из-за чего все потоки, которые не были завершены штатно на момент вызова ExitProcess, были завершены принудительно к моменту вызова DllMain. В этом случае деструкторы классов, управляющих потоками (Idle thread, Logger thread), будут завершены "грязно".
Для преодоления описанных проблем Far имеет функции, которые выполняются однократно во время жизни плагина (GetGlobalInfoW и ExitFARW) и позволяют корректно начать и завершить работу.
Сейчас создание и уничтожение экземпляра плагина происходит в функции
DllMain
. Такое решение имеет несколько проблем:WinAPI
из-за наличияLoader Lock
, поэтому в документации рекомендуют там выполнять только простейшую инициализацию. При расширении/изменении функционала плагина можно нарваться на ограничениеFar
не выгружает плагины через FreeLibrary, поэтомуDLL_PROCESS_DETACH
означает, чтоFar
завершил свою работу и вызвалExitProcess
, из-за чего все потоки, которые не были завершены штатно на момент вызоваExitProcess
, были завершены принудительно к моменту вызоваDllMain
. В этом случае деструкторы классов, управляющих потоками (Idle thread
,Logger thread
), будут завершены "грязно".Для преодоления описанных проблем
Far
имеет функции, которые выполняются однократно во время жизни плагина (GetGlobalInfoW
иExitFARW
) и позволяют корректно начать и завершить работу.Пулл реквест исправляет ситуацию.