Delen via


Filter Control Mutex in AVStream

Elke AVStream-filterinstantie heeft een gekoppelde filter control mutex. Deze mutex wordt gebruikt om de toegang tot de objecthiërarchie te synchroniseren van het filter naar de afzonderlijke pinnen. Het maken en vernietigen van filters en pinnen wordt gesynchroniseerd met deze mutex.

De objecthiërarchie is gegarandeerd alleen stabiel vanaf een specifieke filterinstantie omlaag, terwijl de mutex van de filterbesturing wordt vastgehouden. Daarom moet de minidriver de mutex van het filterbesturingselement verkrijgen voordat de objecthiërarchie onder het filterniveau wordt doorkruist met behulp van de functies KsXxxGetFirstChildXxx en KsXxxGetNextSiblingXxx .

Het filterbesturingsmutex wordt ook gebruikt om toestandsovergangen te synchroniseren.

AVStream verkrijgt de filterbeheer mutex wanneer het eigenschappen verwerkt waarvoor de hiërarchie stabiel moet blijven, zoals bij het uitvoeren van wijzigingen aan descriptors.

Houd er rekening mee dat er één filterbedieningsmutex wordt gebruikt voor de objecthiërarchie onder elk afzonderlijk filter. Dit betekent dat een pinobject de filterbesturing-mutex van het bovenliggende object gebruikt wanneer een minidriver een functie aanroept met een pinobject.

AVStream houdt de mutex voor filtercontrole namens de minidriver vast wanneer het de volgende door de minidriver geleverde routines aanroept:

Net als bij de apparaatmutex mag de filterbesturingsmutex niet recursief verkregen worden. Als AVStream bijvoorbeeld een callback maakt naar een minidriver voor een Create in de context van thread A, waarbij de minidriver later probeert de mutex te verkrijgen vanuit thread A, komt thread A in een deadlock met zichzelf.

Er kan een impasse optreden als u een van de volgende acties uitvoert:

  • Probeer de mutex van de filterbesturing te verkrijgen vanuit de procesroutine.

  • Probeer de filtercontrole-mutex te verkrijgen vanuit de Sleep- of Wake-callback.

Gebruik de volgende functies om de filterbesturingsmutex te bewerken:

KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl