Изменить момент вызова FreeFindData

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Изменить момент вызова FreeFindData

Post by NightRoman »

Хотелось бы, чтобы FreeFindData вызывался тогда, когда Фар уже окончательно и точно не будет работать с этими данными, и главное не будет посылать эти данные в GetFiles, PutFiles и т.п. Сейчас это не так, поправьте, если неправ. Фар вызвал GetFindData, скопировал данные к себе, вызвал FreeFindData. Потом может выполнять всякие операции, в том числе и поиск по вложенным папкам виртуальной ФС, и при этом "помнить" данные из стартовой папки поиска. Поиск заканчивается возвратом в стартовую папку (SetDirectory), но GetFindData Фар не вызывает, а использует данные, которые "помнит". И для которых он уже вызвал FreeFindData у плагина.

Почему это очень неудобно для плагина. Плагин не может эффективно использовать поле UserData файлов, как идентификатор внутреннего ресурса, "прикрепленного" к файлу.

Если бы было так, как предлагается, все было бы просто и идеологически красиво: в GetFindData плагин выделил ресурсы, прикрепил их к UserData. Пока Фар работает с этими данными и запрашивает дополнительные подробности у плагина (GetFiles), эти UserData - валидные хендлы ресурсов, плагину работать очень просто, элементарно.

Но сейчас это не так. Плагин не может прикрепить ресурс к UserData и освободить его при FreeFindData, работа с этими данными не закончена. Хранить приходится как-то еще, выкручиваться. Это более-менее проходит при обычной навигации по ФС. Но с поиском, особенно вложенным, и с просмотром результатов поиска во вьюере или редактора выкрутасы уже такой сложности надо придумывать, что хочется отказаться от поиска в плагине вообще.

Насколько это практически возможно изменить момент вызова FreeFindData в панелях? Имеет ли смысл такой виш отправить на Мантис или не стоит?
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Альтернативные варианты тоже есть, которые могли бы улучшить ситуацию:

1) хороший - добавить в плагин экспортируемую ф-ю FreeUserData, которая вызывается Фаром, когда он у себя освобождает копию данных файлов (а в оригинальном предложении тут и надо FreeFindData звать, вероятно).

2) плохой, но лучше, чем как сейчас - после окончания поисковых операций Фар должен не только SetDirectory вызвать, но и перезапросить данные по GetFindData, а не пользоваться своей копией.
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Но по любому теперешний дизайн странен. Раз есть поле UserData, то очевидно же, что оно предполагается для использования, как ресурс. Не цифирку же там хранить, которая просто дополнительное свойство файла. А раз речь о ресурсах, то и механизм освобождения должен быть аккуратен. Когда эти UserData совсем исчезают со сцены, вот тогда Фар и должен что-то вызвать у плагина (либо FreeFindData скопом, либо FreeUserData по отдельности, это уже детали).
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Отправил на Мантис
http://bugs.farmanager.com/view.php?id=1699
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

я может чего-то не догоняю, но есть же PPIF_USERDATA?
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

zg wrote:я может чего-то не догоняю, но есть же PPIF_USERDATA?
А как это может помочь? Но может и я чего не догоняю. Хочу разобраться, естественно.

Вот простой вопрос по дизайну Фар АПИ для плагинов: в какой именно момент, согласно дизайну, плагин должен освободить выделенные ресурсы, прикрепленные к UserData при вызове GetFindData? Ключевой вопрос, вообще-то. А ответ не ясен.
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Точнее, ответ "ясен" из писания - в FreeFindData, только он неверен. Потому что FreeFindData вызывается задолго до того, как закончена работа с данными, и эти UserData еще будут нужны. О чем этот тикет и есть. FreeFindData должен вызываться в правильный момент, в момент, когда Фар покидает данные панели навсегда (когда свои внутренние записи файлов освобождает, вероятнее всего).

Сейчас, чтобы сделать что-то продвинутое в плагине, работая с мета-данными прикрепленными к файлам, приходится неимоверно извращаться. А некоторые вещи практически невозможны все равно, например поиск средствами Фара, а не самопальными плагина (которые не заменят F3, CtrlQ на папках, сортировку их по размеру и т.п.).
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

NightRoman wrote:А как это может помочь?
фар копирует то, на что указывает UserData себе.
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Понятно, что PPIF_USERDATA позволяет сохранить больше данных чем просто указатель. Но что в этом проку, если эти данные - хендлы ресурсов, которые нельзя вот так просто представить как с-шную структуру в памяти. И вот когда плагину эти хендлы освобождать - загадка. Но не в FreeFindData - это точно.
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

В моем юз-кейсе мне и не надо "много" данных хранить. int - вполне достаточно. Этот int - это хендл .NET объекта, который ассоциирован с Фаровским файлом. Чтобы этот объект не подчистился во время garbage collection, я храню его ссылку в коллекции, и этот int его там идентифицирует. Но не ясно, когда я могу удалить этот объект из коллекции, чтобы уборка мусора его подчистила.

.NET объект нельзя сам в эти UserData поместить. Да и другие юз-кейсы наверняка есть, когда ресурс не так просто впихнуть в с-шную структуру целиком. Остаются только хендлы для использования в UserData. Но Фар такой сценарий не учитывает.
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

NightRoman wrote:Чтобы этот объект не подчистился во время garbage collection, я храню его ссылку в коллекции, и этот int его там идентифицирует. Но не ясно, когда я могу удалить этот объект из коллекции, чтобы уборка мусора его подчистила.
в ClosePlugin.
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

в ClosePlugin.
И сколько там данных может накопиться во время какого-нибудь рекурсивного поиска в панели? Или даже нескольких. Столько, что все упадет в какой-то момент ну или начнет тормозить система из-за нагрузки на память. Так не годится.
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

NightRoman wrote:Так не годится.
я что-то не вижу патча «как годится».
User avatar
NightRoman
Posts: 6109
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 25 times
Been thanked: 58 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

zg wrote:
NightRoman wrote:Так не годится.
я что-то не вижу патча «как годится».
Я и не знаю, как сделать этот патч. И что это меняет? Если можно улучшить что-то в продукте, почему обязательно левый юзер должен патч мастерить?

Простая логика подсказывает, что разумным решением было бы вызывать FreeFindData тогда, когда Фар свои записи по файлам освобождает. Вам виднее, где и как это сделать.
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

NightRoman wrote:Простая логика подсказывает, что разумным решением было бы вызывать FreeFindData тогда, когда Фар свои записи по файлам освобождает.
простая логика подсказывает, что это увеличит расход памяти вдвое для всех остальных плагинов.
Post Reply

Return to “Разработка плагинов”