Фильтрация мьютекса элемента управления в AVStream
Каждый экземпляр фильтра AVStream имеет связанный мьютекс элемента управления фильтром. Этот мьютекс используется для синхронизации доступа к иерархии объектов от фильтра вниз к отдельным контактам. Создание и уничтожение фильтров и контактов синхронизируются с этим мьютексом.
Иерархия объектов гарантированно будет стабильной только от определенного экземпляра фильтра вниз, пока хранится мьютекс элемента управления фильтра. Соответственно, мини-диск должен получить мьютекс элемента управления фильтром перед обходом иерархии объектов ниже уровня фильтра с помощью функций KsXxxGetFirstChildXxx и KsXxxGetNextSiblingXxx .
Мьютекс элемента управления фильтром также используется для синхронизации переходов состояния.
AVStream получает мьютекс элемента управления фильтром при обработке свойств, требующих стабильной иерархии, например при изменении дескриптора.
Имейте в виду, что для иерархии объектов в каждом отдельном фильтре используется один мьютекс элемента управления фильтра. Это означает, что закрепленный объект использует мьютекс родительского элемента управления фильтрами, когда мини-диск вызывает функцию с закрепленным объектом.
AVStream хранит мьютекс элемента управления фильтром от имени мини-драйвера при вызове следующих подпрограмм, предоставляемых мини-driver:
Как и мьютекс устройства, мьютекс элемента управления фильтром не должен быть получен рекурсивно. Если, например, AVStream выполняет обратный вызов мини-driver для отправки Create в контексте потока A, а мини-диск позже пытается получить мьютекс из потока A, поток A взаимоблокирует с самим собой.
Взаимоблокировка может возникнуть, если выполнить одно из следующих действий:
Попробуйте получить мьютекс элемента управления фильтром из подпрограммы процесса.
Попробуйте получить мьютекс элемента управления фильтром из обратного вызова спящего режима или пробуждения.
Чтобы управлять мьютексом элемента управления фильтром, используйте следующие функции:
KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl