Mutex de controle de filtro no AVStream
Cada instância de filtro AVStream tem um mutex de controle de filtro associado. Esse mutex é usado para sincronizar o acesso à hierarquia de objetos do filtro para baixo para os pinos individuais. A criação e a destruição de filtros e pinos são sincronizados com esse mutex.
A hierarquia de objetos tem a garantia de ser estável somente de uma instância de filtro específica para baixo enquanto o mutex de controle de filtro é mantido. Assim, o minidriver deve obter o mutex de controle de filtro antes de percorrer a hierarquia de objetos abaixo do nível de filtro usando as funções KsXxxGetFirstChildXxx e KsXxxGetNextSiblingXxx .
O mutex de controle de filtro também é usado para sincronizar transições de estado.
O AVStream obtém o mutex de controle de filtro quando lida com propriedades que exigem que a hierarquia permaneça estável, como ao executar a modificação do descritor.
Lembre-se de que um mutex de controle de filtro único é usado para a hierarquia de objetos em cada filtro individual. Isso significa que um objeto pin usa o mutex de controle de filtro do pai quando um minidriver chama uma função com um objeto pin.
O AVStream mantém o mutex de controle de filtro em nome do minidriver quando chama as seguintes rotinas fornecidas pelo minidriver:
Semelhante ao mutex do dispositivo, o mutex de controle de filtro não deve ser obtido recursivamente. Se, por exemplo, o AVStream fizer um retorno de chamada para um minidriver para uma expedição Criar no contexto do thread A, e o minidriver mais tarde tentar obter o mutex de dentro do thread A, thread A deadlocks com ele mesmo.
Um deadlock poderá ocorrer se você executar uma das seguintes ações:
Tente adquirir o mutex de controle de filtro de dentro da rotina do processo.
Tente obter o mutex de controle de filtro de dentro do retorno de chamada De suspensão ou de ativação.
Para manipular o mutex de controle de filtro, use as seguintes funções:
KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl