Mutex de dispositivo no AVStream
Use o mutex do dispositivo para sincronizar objetos na hierarquia do dispositivo até os filtros. Cada dispositivo AVStream tem um único mutex de dispositivo associado. A criação e a destruição de fábricas de filtros e filtros são sincronizados com esse mutex. Determinadas operações de gerenciamento de energia e Plug and Play também são sincronizadas com esse mutex. O minidriver se concentra em dois problemas de main em relação ao mutex do dispositivo.
A hierarquia de objetos tem a garantia de ser estável somente do dispositivo até filtros individuais se o mutex do dispositivo for mantido. Como resultado, o minidriver deve obter o mutex do dispositivo antes de criar fábricas de filtro manualmente chamando KsCreateFilterFactory. O minidriver também deve obter o mutex do dispositivo antes de percorrer a hierarquia de objetos chamando as funções KsXxxGetFirstChildXxx e KsXxxGetNextSiblingXxx .
O AVStream mantém o mutex do dispositivo em nome do minidriver quando recebe as seguintes solicitações:
Notificações de suspensão e ativação em filtros e pinos. Consulte KsFilterRegisterPowerCallbacks e KsPinRegisterPowerCallbacks.
É importante observar que o mutex do dispositivo não pode ser obtido recursivamente. Considere o exemplo a seguir. O AVStream recebe uma notificação de suspensão. Conforme descrito acima, ele usa o mutex do dispositivo em nome do minidriver. Se o AVStream chamar uma rotina de retorno de chamada fornecida pelo minidriver no contexto do thread A, o minidriver não deverá tentar obter o mutex do dispositivo no thread A. Isso faz com que o thread A fique em deadlock consigo mesmo.
O AVStream geralmente obtém mutexes de controle de filtro enquanto o mutex do dispositivo já está mantido. Consequentemente, como regra geral, um thread que tenha tomado um mutex de controle de filtro não deve usar posteriormente o mutex do dispositivo.
Para manipular o mutex do dispositivo, use as seguintes funções: