Menggunakan Rutinitas CustomTimerDpc

Untuk menonaktifkan objek timer yang diatur sebelumnya, driver memanggil KeCancelTimer. Rutinitas ini menghapus objek timer dari antrean timer sistem. Umumnya, objek timer tidak diatur ke status bersinyali dan rutinitas CustomTimerDpc tidak diantrekan untuk eksekusi. Namun, jika timer akan kedaluwarsa ketika KeCancelTimer dipanggil, kedaluwarsa mungkin terjadi sebelum KeCancelTimer memiliki kesempatan untuk mengakses antrean waktu, dalam hal ini sinyal dan antrean DPC akan terjadi.

Penarikan kembali KeSetTimer atau KeSetTimerEx, dengan penunjuk Timer dan Dpc yang ditentukan sebelumnya, sebelum interval yang ditentukan sebelumnya kedaluwarsa, memiliki efek berikut:

  • Kernel menghapus objek timer dari antrean timer, tanpa mengatur objek ke status tersinyal atau mengantrekan rutinitas CustomTimerDpc .

  • Kernel memasukkan kembali objek timer dalam antrean timer, menggunakan nilai DueTime baru.

Menggunakan objek timer yang sama untuk tujuan yang berbeda dapat menyebabkan kondisi balapan atau kesalahan pembalap yang serius. Misalnya, asumsikan bahwa driver menentukan objek timer tunggal untuk menyiapkan panggilan ke rutinitas CustomTimerDpc dan untuk menyiapkan tunggu di utas khusus driver. Setiap kali utas khusus driver memanggil KeSetTimer, KeSetTimerEx, atau KeCancelTimer untuk objek timer umum, utas akan membatalkan panggilan ke rutinitas CustomTimerDpc , jika objek timer sudah diantrekan untuk panggilan CustomTimerDpc .

Jika driver memiliki rutinitas CustomTimerDpc , dan juga menunggu objek timer dalam konteks utas nonarbitrer, itu harus:

  • Jangan pernah menggunakan objek timer yang sensitif terhadap konteks utas dalam konteks utas nonarbitrer, atau sebaliknya.

  • Alokasikan objek timer terpisah untuk setiap rutinitas CustomTimerDpc . Setiap set utas driver atau rutinitas driver yang dipanggil dalam konteks utas nonarbitrer harus memiliki sekumpulan objek timer "dapat ditunggu" sendiri.

Jika Anda menggunakan rutinitas CustomTimerDpc , pilih dengan cermat interval yang diteruskan driver dalam panggilan ke KeSetTimer atau KeSetTimerEx. Selain itu, pertimbangkan semua kemungkinan efek panggilan ke KeCancelTimer dengan objek timer yang sama dari rutinitas driver apa pun yang melakukan panggilan ini, terutama pada platform SMP.

Perlu diingat fakta berikut tentang rutinitas CustomTimerDpc :

Hanya satu instansiasi objek DPC yang mewakili rutinitas DPC tertentu yang dapat diantrekan untuk eksekusi pada saat tertentu.

Jika rutinitas driver kedua memanggil KeSetTimer atau KeSetTimerEx untuk menjalankan rutinitas CustomTimerDpc yang sama sebelum interval yang ditentukan oleh pemanggil pertama kedaluwarsa, rutinitas CustomTimerDpc dijalankan hanya setelah interval yang ditentukan oleh pemanggil kedua kedaluwarsa. Dalam keadaan ini, CustomTimerDpc tidak melakukan pekerjaan yang rutinitas pertamanya disebut KeSetTimer atau KeSetTimerEx.

Untuk driver yang memiliki rutinitas CustomTimerDpc dan gunakan timer berkala:

Driver tidak dapat membatalkan alokasi timer berkala dari rutinitas DPC. Driver hanya dapat membatalkan alokasi timer nonperiodic dari rutinitas DPC.

Pertimbangkan panduan desain berikut untuk driver yang memiliki rutinitas CustomDpc dan CustomTimerDpc :

Untuk mencegah kondisi balapan, jangan pernah meneruskan penunjuk Dpc yang sama ke KeSetTimer atau KeSetTimerEx dan KeInsertQueueDpc.

Dengan kata lain, misalkan startIo rutin driver memanggil KeSetTimer atau KeSetTimerEx untuk mengantre rutin CustomTimerDpc , dan ISR driver memanggil KeInsertQueueDpc secara bersamaan dari prosesor lain dengan penunjuk Dpc yang sama. Rutinitas DPC tersebut akan dijalankan ketika IRQL pada prosesor berada di bawah DISPATCH_LEVEL atau interval timer kedaluwarsa, mana yang lebih dulu. Mana pun yang lebih dulu, beberapa pekerjaan penting untuk StartIo atau ISR hanya akan dihilangkan oleh rutinitas DPC.

Selain itu, DPC yang digunakan oleh dua rutinitas driver standar dengan fungsionalitas yang sangat berbeda akan memiliki karakteristik performa yang lebih buruk daripada rutinitas CustomTimerDpc dan CustomDpc terpisah. DPC harus menentukan operasi mana yang akan dilakukan, tergantung pada kondisi yang menyebabkan rutinitas StartIo atau ISR mengantrenya. Pengujian untuk kondisi ini di DPC akan menggunakan siklus CPU tambahan.