Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Chcete-li zakázat dříve nastavený objekt časovače, ovladač volá KeCancelTimer. Tato rutina odebere objekt časovače z fronty časovače systému. Obecně platí, že objekt časovače není nastaven na signalovaný stav a rutina CustomTimerDpc není zařazena do fronty pro spuštění. Pokud se však časovač blíží vypršení platnosti při zavolání KeCancelTimer, může dojít k vypršení platnosti dříve, než má KeCancelTimer šanci přistoupit k časové frontě, a v takovém případě dojde k signalizaci a zařazení DPC do fronty.
Odvolání KeSetTimer nebo KeSetTimerEx s dříve zadanými ukazateli Časovač a Dpc před vypršením dříve zadaného intervalu má následující účinky:
Jádro odebere objekt časovače z fronty časovače bez nastavení objektu do signalovaného stavu nebo řazení do fronty rutiny CustomTimerDpc .
Jádro znovu vloží objekt časovače do fronty časovače pomocí nové hodnoty DueTime .
Použití stejného objektu časovače pro různé účely může způsobit časování nebo závažné chyby řidiče. Předpokládejme například, že ovladač určuje jeden objekt časovače pro nastavení volání rutiny CustomTimerDpc a nastavení čekání ve vlákně vyhrazeném ovladačem. Kdykoli vlákno vyhrazené ovladači zavolá KeSetTimer, KeSetTimerEx nebo KeCancelTimer pro běžný objekt časovače, vlákno zruší volání rutiny CustomTimerDpc, pokud byl objekt časovače již zařazen do fronty na volání CustomTimerDpc.
Pokud má ovladač rutiny CustomTimerDpc a také čeká na objekty časovače v nevolitelném kontextu vlákna, měl by:
Nikdy nepoužívejte objekt časovače závislý na kontextu vlákna v neurčitém kontextu vlákna nebo naopak.
Přidělte samostatný objekt časovače pro každou rutinu CustomTimerDpc . Každá sada vláken ovladačů nebo rutin ovladačů, které jsou volány v definovaném kontextu vlákna, by měla mít vlastní sadu "waitable" objektů časovače.
Pokud používáte rutinu CustomTimerDpc, pečlivě zvolte interval, který ovladač předává volání KeSetTimer nebo KeSetTimerEx. Kromě toho zvažte všechny možné účinky volání KeCancelTimer se stejným objektem časovače z jakékoli rutiny ovladače, která toto volání provádí, zejména na platformách SMP.
Mějte na paměti následující fakt o rutinách CustomTimerDpc :
Pro provádění v daném okamžiku může být rozvržena pouze jedna instance objektu DPC reprezentující konkrétní rutinu DPC.
Pokud druhá rutina ovladače volá KeSetTimer nebo KeSetTimerEx ke spuštění stejné rutiny CustomTimerDpc před vypršením intervalu určeného prvním volajícím, je rutina CustomTimerDpc spuštěna až po uplynutí intervalu určeného druhým volajícím vyprší. V těchto případech CustomTimerDpc neprovede žádnou práci, pro kterou se první rutina nazývá KeSetTimer nebo KeSetTimerEx.
Pro ovladače, které mají rutiny CustomTimerDpc a používají pravidelné časovače:
Ovladač nemůže uvolnit pravidelný časovač z rutiny DPC. Ovladače můžou uvolnit pouze neperiodické časovače z rutiny DPC.
Zvažte následující pokyny návrhu pro ovladače, které mají rutiny CustomDpc i CustomTimerDpc :
Chcete-li zabránit závodním podmínkám, nikdy nepředávejte stejný ukazatel DpcKeSetTimer nebo KeSetTimerEx a zároveň KeInsertQueueDpc.
Jinými slovy, předpokládejme, že rutina StartIo ovladače volá KeSetTimer nebo KeSetTimerEx k zařazení rutiny CustomTimerDpc do fronty a ISR ovladače současně volá KeInsertQueueDpc z jiného procesoru se stejným ukazatelem Dpc. Tato rutina DPC se spustí, když irQL v procesoru klesne pod DISPATCH_LEVEL nebo vyprší interval časovače podle toho, co nastane dříve. Podle toho, co nastane dříve, by rutina DPC jednoduše vypnula určitou základní práci pro StartIo nebo ISR.
Kromě toho by DPC používané dvěma standardními rutinami ovladačů s velmi odlišnými funkcemi měly horší charakteristiky výkonu než samostatné rutiny CustomTimerDpc a CustomDpc . Rutina DPC by musela určit, které operace se mají provést, v závislosti na podmínkách, které způsobily zařazení do fronty rutiny StartIo nebo ISR. Testování těchto podmínek v DPC by používalo další cykly procesoru.