Freigeben über


Filtersteuerelement Mutex in AVStream

Jede AVStream-Filterinstanz verfügt über einen zugehörigen Mutex für die Filtersteuerung. Dieser Mutex wird verwendet, um den Zugriff auf die Objekthierarchie vom Filter bis hinunter zu einzelnen Pins zu synchronisieren. Die Erzeugung und Zerstörung von Filtern und Pins wird mit diesem Mutex synchronisiert.

Die Objekthierarchie ist nur garantiert stabil von einer bestimmten Filterinstanz abwärts, während das Mutex des Filtersteuerelements gehalten wird. Dementsprechend muss der Minidriver den Filtersteuerungsmutex abrufen, bevor er die Objekthierarchie unterhalb der Filterebene mithilfe der Funktionen KsXxxGetFirstChildXxx und KsXxxGetNextSiblingXxx durchläuft.

Das Filtersteuerelement mutex wird auch zum Synchronisieren von Zustandsübergängen verwendet.

AVStream erwirbt den Mutex des Filtersteuerungselements, wenn es Eigenschaften verarbeitet, die erfordern, dass die Hierarchie stabil bleibt, z. B. bei Deskriptoränderungen.

Beachten Sie, dass ein einzelner Steuerungs-Mutex für die Objekthierarchie unter jedem einzelnen Filter verwendet wird. Dies bedeutet, dass ein Pinobjekt den Mutex des übergeordneten Filtersteuerelements verwendet, wenn ein Minidriver eine Funktion mit einem Pinobjekt aufruft.

AVStream hält den Filter-Steuerungsmutex im Auftrag des Minidrivers, wenn er die folgenden von Minidriver bereitgestellten Routinen aufruft:

Ähnlich wie beim Gerätemutex darf das Filtersteuerungs-Mutex nicht rekursiv abgerufen werden. Wenn AVStream beispielsweise einen Rückruf an einen Minidriver für einen Create-Dispatch im Kontext von Thread A vornimmt und der Minidriver später versucht, den Mutex innerhalb von Thread A abzurufen, blockiert sich Thread A selbst.

Ein Deadlock kann auftreten, wenn Sie eine der folgenden Aktionen ausführen:

  • Versuchen Sie, den Mutex für die Steuerung des Filters innerhalb der Prozessroutine zu erhalten.

  • Versuchen Sie, den Mutex der Filtersteuerung entweder innerhalb des Sleep- oder Wake-Callbacks abzurufen.

Verwenden Sie die folgenden Funktionen, um das Filtersteuerelement mutex zu bearbeiten:

KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl