Sincronizzazione dell'annullamento di IRP
Dal punto di vista di un conducente, un IRP può essere annullato in qualsiasi momento. L'annullamento di IRP si verifica in modo asincrono; pertanto, i piloti devono essere in grado di gestire una serie di potenziali race condition, creati se l'IRP viene annullato in uno dei punti seguenti:
Dopo la chiamata di una routine del driver, ma prima di accodarsi un IRP.
Dopo la chiamata di una routine del driver, ma prima di provare a elaborare un IRP. Ad esempio, un IRP potrebbe essere annullato dopo la chiamata della routine StartIo di un driver, ma prima che la routine StartIo rimuova l'IRP dalla coda del dispositivo.
Dopo che la routine del driver rimuove dalla coda l'IRP, ma prima di avviare l'I/O richiesto.
Si noti che dopo che un driver accoda un IRP e rilascia eventuali blocchi spin che proteggono la coda, un altro thread può accedere e modificare l'IRP. Quando il thread originale riprende, anche non appena la riga di codice successiva, l'IRP potrebbe essere già stato annullato o modificato in altro modo.
Il driver può usare il framework di accodamento IRP indipendente dall'annullamento per implementare l'accodamento IRP. Il sistema registra quindi una routine Cancel per il driver che gestisce automaticamente la sincronizzazione per annullare in modo sicuro i runtime di integrazione. Per altre informazioni, vedere Cancel-Safe IRP Queues .See Cancel-Safe IRP Queues for more information. In caso contrario, i driver devono implementare la propria sincronizzazione.
I membri seguenti di un IRP contengono informazioni sull'annullamento:
Irp-> Cancel indica se un IRP viene annullato o deve essere annullato.
Irp-> CancelRoutine indica se un IRP è annullabile. Se questo membro contiene un puntatore a una routine di annullamento, l'IRP è annullabile. Se questo membro è NULL, l'IRP non è annullabile. Se questo membro è NULL, ma Irp-Cancel> è impostato, ciò indica che la routine di annullamento è in esecuzione e che l'IRP è in corso di annullamento.
Se un driver gestisce i runtime di integrazione annullabili, è responsabile dell'impostazione della routine Cancel appropriata in ogni IRP che contiene in uno stato annullabile.If a driver handle cancelable IRPs, it is responsible for setting the appropriate Cancel routine in each IRP that it holds in a cancelable state.
Questa sezione include gli argomenti seguenti sulla sincronizzazione dell'annullamento di IRP.
Uso del blocco di selezione annulla del sistema
Sincronizzazione dell'annullamento nelle routine del driver che elaborano i runtime di integrazione
Sincronizzazione dell'annullamento nei driver Higher-Level senza annullare routine