"защита" от вызова из неосновных нитей

Разработка Far.
Post Reply
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

"защита" от вызова из неосновных нитей

Post by NightRoman »

(еще не баг репорт, проверить не могу, но может быть пытаюсь предотвратить)
drkns 19.02.2012 20:23:52 +0200 - build 2470
2. Там же - добавлена "защита" от вызова из неосновных нитей туда, где так делать нельзя.
Правильно я понимаю, что там стоит проверка на неосновной поток и делается отлуп?

Если понимаю правильно, то это неправильный подход. Так помнится поначалу делал Maximus5 в бисе (типа ворнингов), и в PowerShellFar, например, эти ворнинги сыпались то и дело (причем там даже костыль нельзя было сделать, ибо такова архитектура ядра PowerShell). При этом практика доказывает, что никаких нитевых проблем PowerShellFar не создает.

Вызов из неосновного потока - это не значит, что не thread safe. Thread safe - это когда код гарантирует, что не будет никаких конфликтов нитей, а запускать он может сколько угодно нитей и звать из них не thread safe функции, но с соблюдением thread safe правил. Поэтому, если поставить брутальную проверку на неосновной поток, то это без всяких оснований сделает невозможными многие сценарии.

Если же я понял смысл изменения неправильно, и такой засады не будет, тогда проехали, не обращайте внимания.
User avatar
DrKnS
Posts: 5810
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 345 times

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by DrKnS »

Там написано - "туда, где так делать нельзя". Например, создание диалога или редактора из неосновной нити погнет внутренее состояние фара, как ты в плагине не приседай. В то же время, почти все FSF и многое из ACTL_ звать можно и там отлупа нет.

Где-то мог влепить лишнее, да. Надо тестировать :)
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by NightRoman »

Почему же нельзя диалог? Фар зовет плуг (PSF) из нити А. Плуг зовет PowerShell в этой нити и передает туда скрипт блок (упрощаю кое-что). PowerShell запускает новый поток Б и в этом потоке вызывает этот скрипт модально, то есть поток А приостанавливается, пока Б не закончит. Теперь этот мой скрипт создает диалог Фара. Управление к Фару из потока А еще не вернулось, поток А ничего не делает, вызовы идут из Б. Но что тут может поломаться? Все также происходит, как будто бы всего один поток А и был (логически, хотя физически уже 2).
Last edited by NightRoman on Mon 20 Feb, 2012 00:28, edited 1 time in total.
Maximus5
Posts: 3294
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 7 times
Contact:

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by Maximus5 »

DrKnS wrote:создание диалога или редактора из неосновной нити погнет внутренее состояние фара
А вот фигу. Плагин заморозил основную нить WaitForSingleObject(h,INFINITE) и создает диалог в фоновом thread. Работает с диалогом, закрывает его, отпускает основную нить. Таких сценариев - навалом.
И что печально, нельзя однозначно определить, заморожена основная нить или нет...
Maximus5
Posts: 3294
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 7 times
Contact:

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by Maximus5 »

Эээ?
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by NightRoman »

И что печально, нельзя однозначно определить, заморожена основная нить или нет...
Да, и более того, она и вообще не обязательно может быть заморожена, она может что-то делать и даже продолжать делать вызовы Фара вперемешку с другими потоками плагина. Но если плагин все сделал правильно и эти его вызовы (неважно из скольки потоков) никогда не происходят одновременно, то все чисто и законно, все thread safe, и должно работать.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by NightRoman »

DrKnS
В 2475 в тестах отвалилось несколько вещей, начну с первой, которую, надеюсь, тебе несложно будет воспроизвести (помню, PowerShellFar ты можешь пользовать).

Шаги
* Запустить Фар, ничего не открывать
* В комстроке набрать команду PowerShell

Code: Select all

>: $Far.Window.Count
Итог
* 2475 выводит 0 (неправильно, возможно, просто сбой в ACTL_GETWINDOWCOUNT)
* 2468 выводит 1 (правильно)

Код $Far.Window.Count в C++/CLI выглядит так

Code: Select all

int Window::Count::get()
{
	return (int)Info.AdvControl(&MainGuid, ACTL_GETWINDOWCOUNT, 0, 0);
}
User avatar
DrKnS
Posts: 5810
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 345 times

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by DrKnS »

NightRoman wrote:В 2475 в тестах отвалилось несколько вещей, начну с первой
А всё сразу не?

2476.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Re: Глюки и баги, появившиеся в «ночных сборках»

Post by NightRoman »

DrKnS wrote:А всё сразу не?
Не. Не так все просто. В 2476 стало получше. Но тесты пока не проходят. Репорт будет, но как только смогу.
Post Reply

Return to “Development”