Condividi tramite


Controllo del filtro Mutex in AVStream

Ogni istanza del filtro AVStream ha un mutex di controllo filtro associato. Questo mutex viene usato per sincronizzare l'accesso alla gerarchia di oggetti dal filtro fino ai singoli pin. La creazione e la distruzione di filtri e pin vengono sincronizzati con questo mutex.

È garantito che la gerarchia degli oggetti sia stabile solo da un'istanza di filtro specifica verso il basso mentre il mutex del controllo filtro è attivato. Di conseguenza, il minidriver deve ottenere il mutex del controllo filtro prima di attraversare la gerarchia di oggetti sotto il livello di filtro utilizzando le funzioni KsXxxGetFirstChildXxx e KsXxxGetNextSiblingXxx.

Il mutex del controllo filtro viene usato anche per sincronizzare le transizioni di stato.

AVStream ottiene il mutex del controllo filtro quando gestisce le proprietà che richiedono che la gerarchia rimanga stabile, ad esempio quando si esegue la modifica del descrittore.

Tenere presente che per la gerarchia degli oggetti sotto ogni singolo filtro viene utilizzato un unico mutex di controllo del filtro. Ciò significa che un oggetto pin utilizza il mutex di controllo del filtro del proprio genitore quando un minidriver chiama una funzione con un oggetto pin.

AVStream mantiene il mutex del controllo filtro per conto del minidriver quando chiama le seguenti routine fornite dal minidriver.

Analogamente al mutex del dispositivo, il mutex del controllo filtro non deve essere ottenuto in modo ricorsivo. Se, ad esempio, AVStream esegue un callback a un minidriver per un dispatch Create nel contesto del thread A, e il minidriver in seguito tenta di ottenere il mutex all'interno dello stesso thread A, si verifica un deadlock in cui il thread A si blocca con se stesso.

Un deadlock può verificarsi se si esegue una delle azioni seguenti:

  • Provare ad acquisire il mutex di controllo del filtro all'interno della routine di processo.

  • Provare a ottenere il mutex del controllo filtro dall'interno del callback di sospensione o di riattivazione.

Per modificare il mutex del controllo filtro, usare le funzioni seguenti:

KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl