Compartilhar via


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