Filtro mutex del controllo in AVStream
Ogni istanza del filtro AVStream ha un mutex del controllo filtro associato. Questo mutex viene usato per sincronizzare l'accesso alla gerarchia di oggetti dal filtro verso il basso ai singoli pin. La creazione e la distruzione di filtri e pin vengono sincronizzati con questo mutex.
La gerarchia di oggetti è garantita che sia stabile solo da un'istanza di filtro specifica verso il basso mentre il mutex del controllo filtro è mantenuto. Di conseguenza, il minidriver deve ottenere il mutex del controllo filtro prima di attraversare la gerarchia di oggetti sotto il livello di filtro usando 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 viene usato un singolo mutex di controllo filtro per la gerarchia di oggetti in ogni singolo filtro. Ciò significa che un oggetto pin usa il mutex del controllo filtro padre quando un minidriver chiama una funzione con un oggetto pin.
AVStream contiene il mutex del controllo filtro per conto del minidriver quando chiama le routine fornite dal minidriver seguenti:
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 tenta successivamente di ottenere il mutex dall'interno del thread A, thread A deadlocks con se stesso.
Un deadlock può verificarsi se si esegue una delle azioni seguenti:
Provare ad acquisire il mutex del controllo filtro dall'interno della routine del processo.
Provare a ottenere il mutex del controllo filtro dall'interno del callback Sospensione o Riattivazione.
Per modificare il mutex del controllo filtro, usare le funzioni seguenti:
KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl