Compartilhar via


Mutex de controle do filtro no AVStream

Cada instância de filtro do AVStream possui um mutex associado para controle do filtro. Esse mutex é usado para sincronizar o acesso à hierarquia de objetos do filtro até os pinos individuais. A criação e a destruição de filtros e pinos são sincronizados com esse mutex.

A hierarquia de objetos é garantida como 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 do 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.

AVStream obtém o mutex de controle de filtro quando manipula 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 é utilizado para a hierarquia de objetos sob cada filtro individual. Isso significa que um objeto de pin usa o mutex do controle de filtro do pai quando um minidriver chama uma função com esse objeto de pin.

O AVStream mantém o mutex de controle do filtro em nome do minidriver ao chamar as seguintes rotinas fornecidas pelo próprio 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 um despacho Create no contexto do thread A, e o minidriver tentar obter o mutex de dentro do thread A, o thread A entra em deadlock consigo mesmo.

Um deadlock poderá ocorrer se você executar uma das seguintes ações:

  • Tente adquirir o mutex do controle de filtro dentro da rotina do processo.

  • Tente obter o mutex de controle de filtro de dentro do retorno de chamada de suspensão ou ativação.

Para manipular o mutex de controle de filtro, use as seguintes funções:

KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl