Exclusión mutua de control de filtro en AVStream
Cada instancia de filtro AVStream tiene una exclusión mutua de control de filtro asociada. Esta exclusión mutua se usa para sincronizar el acceso a la jerarquía de objetos desde el filtro hacia abajo a las patillas individuales. La creación y destrucción de filtros y patillas se sincronizan con esta exclusión mutua.
Se garantiza que la jerarquía de objetos es estable solo desde una instancia de filtro específica hacia abajo mientras se mantiene la exclusión mutua del control de filtro. En consecuencia, el minidriver debe obtener la exclusión mutua del control de filtro antes de atravesar la jerarquía de objetos por debajo del nivel de filtro mediante las funciones KsXxxGetFirstChildXxx y KsXxxGetNextSiblingXxx .
La exclusión mutua del control de filtro también se usa para sincronizar las transiciones de estado.
AVStream obtiene la exclusión mutua del control de filtro cuando controla las propiedades que requieren que la jerarquía permanezca estable, como al realizar la modificación del descriptor.
Tenga en cuenta que se usa una exclusión mutua de control de filtro único para la jerarquía de objetos en cada filtro individual. Esto significa que un objeto pin usa la exclusión mutua del control de filtro de su elemento primario cuando un minidriver llama a una función con un objeto pin.
AVStream contiene la exclusión mutua de control de filtro en nombre del minidriver cuando llama a las siguientes rutinas proporcionadas por minidriver:
De forma similar a la exclusión mutua del dispositivo, la exclusión mutua del control de filtro no se debe obtener de forma recursiva. Si, por ejemplo, AVStream realiza una devolución de llamada a un minidriver para un envío Create en el contexto del subproceso A, y el minidriver intenta obtener la exclusión mutua desde el subproceso A, subproceso A interbloqueos con sí mismo.
Se puede producir un interbloqueo si realiza alguna de las siguientes acciones:
Intente adquirir la exclusión mutua del control de filtro desde dentro de la rutina de proceso.
Intente obtener la exclusión mutua del control de filtro desde la devolución de llamada Sleep o Wake.
Para manipular la exclusión mutua del control de filtro, use las siguientes funciones:
KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl