Комментарии 49
задержка загрузки shell32.dll
правильнее перевести как отложенная загрузка
автор патчей был так благодарен за моё расследование, что выдвинул меня на корпоративный бонус
не в первый раз вижу, как сотрудники гугла охотятся за бонусами: скрывают баги, тырят идеи для патентов. предлагаю еще одну креативную схему:
1. в мелкософт засылается соучастник, который под любым предлогом (безопасность, защита от педофилов и т.д.) добавляет в винду патч, который замедляет процессы, если их запускать по несколько тысяч. условия специфические, поэтому никто не замечает подвох.
2. чувак в гугле выявляет и исправляет тормоза.
3.
ну это так, на правах шутки.
удерживая при этом критический раздел system-global user32Не стоило так переводить "критическую секцию".
Ссылка на "часть 2" ведет на часть 1.
А что в самом MS происходит раз они выпускают Update с такой проблемой? У них же самих должен быть набор тестов для WIN32 API, и он идее прогон их тестового набора тоже должен был замедлиться в несколько раз, им было на это наплевать?
Маловероятно, что у них есть тест, проверяющий завершение 1000 процессов
Это же одна из самых востребованных функций ОС — запуск новых процессов,
думаете у них теста одновременного запуска максимально возможного количества процессов? А как иначе тестировать обработку максимального количества объектов разного рода от дескрипторов файлов до GDI объектов и как ОС обрабатывает эту ситуацию. Очень странно было бы не автоматизировать проверку обработки этого крайнего случая.
Но я имел ввиду не конкретный тест, а совокупность тестов. Разработчики llvm не делают же чего-то необычного запуская тесты в нескольких процессах одновременно,
точно также прогон тестов WIN32 API и всех компиляторов разработанных MS должен по идее выглядеть.
HDD и 8Гб ОЗУ — курсор бегает без проблем. Вообще никогда не слышал о такой проблеме.
Вин 7.
Долго мучались, ускоряли и спрямляли логику, даже нашли и пофиксили 10+ багов в разных деструкторах. Уже второй дедлайн пропущен. Пока не заметили (прямо как в истории про «платье короля», интерн спросил техлида — «смотрите, а почему это так ?»), что при креше программа «завершается практически мгновенно».
После этого прикрутили флажок к глобальному обработчику (все нормально, это мы выходим, не пугай пользователя) и после flush на файл сейва — делили единицу на ноль (или разыменовывали NULL, уже не помню). Еле потом уговорили ПМа, что так на самом деле делать нельзя и в других играх такого делать больше не будем.
А разве нет возможности забить на вызов деструкторов статических переменных и выйти так без креша?
if (g_isFastExiting) return;
Но это сколько надо исходников менять + зависимость всех объектов от модуля с флагом — нехорошо.
Либо
ExitProcess(0)
;Вообще, стремление было сделать выход с «останавливаем все потоки, закрываем все дескрипторы, и помечаем всю выделенную память как пустую».
Так что «выход с крешем» просто был самым быстрым вариантом для реализации (второй дедлайн, рождество через неделю), чтобы не плодить лишних зависимостей никуда, кроме обработчика сигналов.
Рискну предположить, что abort уже был обвязан своей логикой (т.е. SIGABRT уже что-то делал), в том числе и прочие штатные пути типа onexit/atexit. А хотелось — чтобы никаких деструкторов, никаких раскруток стеков, просто стопануть, всю память освободить (прямо на уровне «железа» — пометить страницы свободными и досвидания, гори дом вместе с тараканами) и все.
Тогда надо вызывать std::terminate()
. Необработанные исключения вызывают именно его.
std::terminate
, который в штатном варианте вызвает std::abort
, который вызывает сигнал SIGABRT
, который обрабатывается его обработчиком? При этом сигнал SIGSEGV ( *NULL=0; )
— сразу летит на свой обработчик (да, можно пошаманить с __try… __catch, но смысл ?).перечитал доки по
std::terminate()
— сейчас я бы наверно пробовал что-то типа std::_Exit(EXIT_SUCCESS);
, но, как говорится: «был бы я такой умный, как моя жена завтра» :)UPD: вспомнил еще засаду для всех вариантов с std::zzzz: там был свой набор libc/libcpp/etc, так что вполне могло быть что и std::_Exit был перегруженый, с вызовом внутреннего менеджера памяти, так что сложно сказать — сработало бы или нет…
void _exit(int status);
The function _exit() terminates the calling process «immediately». Any open file descriptors belonging to the process are closed.
А почему нельзя было сделать просто ExitProcess(0)?
Вобщем, проблема была устранена в 1803, в одном из ноябрьских обновлений.
Но, когда я поставил Windows 1809, с декабрьскими обновлениями, оказалось, что проблема никуда не исчезла. Бред какой-то. Регресс как он есть.
И ведь это semi-annual update (targeted). Официальный.
Обидно очень. Хотелось бы как-то связаться с инженерами и ускорить выпуск патча.
И забыть обо всём об этом.
Проблема очень критическая, т.к. если кто знает ARQA QUIK — эта программа НЕЩАДНО тормозит именно из-за бага в win32kfull.sys, куда уходит банальная функция gdi lineTo
win32kfull.sys!NtGdiLineTo и далее знакомый EPATHOBJ::bSimpleStroke
Система настолько тормозит, что даже банальные часы в таскбаре замирают на несколько секунд. При этом 4 ядра, 8 нитей HT, 16 гиг памяти, винт SSD, всё доступно, но…
Невызванная функция замедляет программу в 5 раз