Bagikan melalui


Menggunakan Item Kerja Kerangka

Item kerja adalah tugas yang dilakukan driver dalam fungsi panggilan balik peristiwa EvtWorkItem. Fungsi-fungsi ini berjalan secara asinkron, di IRQL = PASSIVE_LEVEL, dalam konteks thread pekerja sistem.

Driver berbasis kerangka kerja biasanya menggunakan item kerja jika fungsi EvtInterruptDpc atau EvtDpcFunc , yang berjalan di IRQL = DISPATCH_LEVEL, harus melakukan pemrosesan tambahan di IRQL = PASSIVE_LEVEL.

Dengan kata lain, driver dapat menggunakan item kerja jika fungsi yang berjalan di IRQL = DISPATCH_LEVEL harus memanggil fungsi yang hanya dapat dipanggil di IRQL = PASSIVE_LEVEL.

Biasanya, fungsi panggilan balik EvtInterruptDpc atau EvtDpcFunc driver membuat objek item kerja dan menambahkannya ke antrean item kerja sistem. Selanjutnya, utas pekerja sistem mengeluarkan objek dari antrean dan memanggil fungsi callback EvtWorkItem dari item kerja.

Contoh Driver yang Menggunakan Item Kerja

Contoh driver berbasis kerangka kerja yang menggunakan item kerja termasuk 1394, AMCC5933, PCIDRV, dan Toaster.

Menyiapkan Item Kerja

Untuk menyiapkan item kerja, pengemudi Anda harus:

  1. Buat item kerja.

    Driver Anda memanggil WdfWorkItemCreate untuk membuat objek item kerja dan mengidentifikasi fungsi panggilan balik EvtWorkItem yang akan memproses item kerja.

  2. Simpan informasi tentang item kerja.

    Biasanya, driver menggunakan memori konteks objek item kerja untuk menyimpan informasi tentang tugas yang harus dilakukan fungsi panggilan balik EvtWorkItem . Ketika fungsi panggilan balik EvtWorkItem dipanggil, fungsi tersebut dapat mengambil informasi dengan mengakses memori konteks ini. Untuk informasi tentang cara mengalokasikan dan mengakses memori konteks, lihat Ruang Konteks Objek Kerangka Kerja.

  3. Tambahkan item kerja ke antrean item kerja sistem.

    Driver Anda memanggil WdfWorkItemEnqueue, yang menambahkan item kerja driver ke antrean item kerja.

Saat driver memanggil WdfWorkItemCreate, driver harus menyediakan handle ke objek perangkat kerangka kerja atau objek antrean kerangka kerja. Ketika sistem menghapus objek tersebut, sistem juga menghapus item kerja yang ada yang terkait dengan objek. Objek item kerja akan dihapus dan fungsi panggilan balik item kerja terkait akan dibersihkan sebelum panggilan balik EvtCleanupCallback dari objek induk dipanggil.

Untuk informasi selengkapnya tentang aturan pembersihan untuk hierarki objek kerangka kerja, lihat Siklus Hidup Objek Kerangka Kerja.

Menggunakan Fungsi Panggilan Balik Work-Item

Setelah item kerja ditambahkan ke antrean item kerja, item tersebut tetap dalam antrean hingga utas pekerja sistem tersedia. Utas pekerja sistem menghapus item kerja dari antrean lalu memanggil fungsi panggilan balik EvtWorkItem driver, meneruskan objek item kerja sebagai input.

Biasanya, fungsi panggilan balik EvtWorkItem melakukan langkah-langkah berikut:

  1. Mendapatkan informasi yang disediakan driver tentang item kerja dengan mengakses memori konteks objek item kerja.

  2. Melakukan tugas yang Anda tentukan. Jika perlu, fungsi panggilan balik dapat memanggil WdfWorkItemGetParentObject untuk menentukan objek induk item kerja.

  3. Memanggil WdfObjectDelete untuk menghapus objek item kerja atau, jika driver akan mengantrikan kembali item kerja, menunjukkan bahwa handle untuk item kerja sekarang tersedia untuk digunakan kembali.

Tugas yang dilakukan fungsi panggilan balik setiap item kerja harus relatif singkat. Sistem operasi menyediakan utas pekerja sistem dalam jumlah terbatas, sehingga driver Anda dapat menghambat performa sistem jika menggunakan fungsi panggilan balik item kerja untuk melakukan tugas yang memakan waktu.

Membuat dan Menghapus Item Kerja

Driver dapat menggunakan salah satu dari dua teknik berikut untuk membuat dan menghapus item kerja:

  • Gunakan setiap item kerja sekali: buat item kerja saat Anda membutuhkannya dan hapus segera setelah digunakan.

    Teknik ini berguna untuk driver yang memerlukan penggunaan jarang (kurang dari satu kali per menit) dari sejumlah kecil elemen kerja.

    Misalnya, fungsi panggilan balik EvtInterruptDpc driver dapat memanggil WdfWorkItemCreate lalu WdfWorkItemEnqueue, dan fungsi panggilan balik EvtWorkItem item kerja dapat memanggil WdfObjectDelete.

    Jika driver Anda mengikuti skenario ini, dan jika fungsi panggilan balik EvtInterruptDpc menerima nilai pengembalian STATUS_INSUFFICIENT_RESOURCES dari WdfWorkItemCreate, driver harus dapat menunda pekerjaan yang diperlukan sampai sumber daya sistem (biasanya memori) tersedia.

  • Buat satu atau beberapa item kerja yang diantrikan ulang oleh driver yang Anda gunakan seperlunya.

    Teknik ini berguna untuk driver yang kerap menggunakan item kerja (lebih dari satu kali per menit), atau jika fungsi panggilan balik EvtInterruptDpc driver Anda tidak dapat dengan mudah menangani hasil kembalian STATUS_INSUFFICIENT_RESOURCES dari WdfWorkItemCreate.

    Sistem tidak mengalokasikan utas pekerja untuk item kerja hingga driver memanggil WdfWorkItemEnqueue. Oleh karena itu, meskipun utas pekerja sistem merupakan sumber daya terbatas, pembuatan item kerja saat menginisialisasi perangkat hanya mengonsumsi sedikit memori dan tidak berpengaruh terhadap performa sistem.

    Langkah-langkah berikut menjelaskan kemungkinan skenario:

    1. Fungsi panggilan balik EvtDriverDeviceAdd driver memanggil WdfWorkItemCreate untuk mendapatkan handel item kerja.
    2. Fungsi panggilan balik EvtInterruptDpc driver membuat daftar tindakan yang harus dilakukan fungsi panggilan balik EvtWorkItem lalu memanggil WdfWorkItemEnqueue, menggunakan handel dari langkah 1.
    3. Fungsi panggilan balik EvtWorkItem driver melakukan daftar tindakan dan mengatur bendera untuk menunjukkan bahwa fungsi panggilan balik telah berjalan.

    Selanjutnya, setiap kali fungsi callback EvtInterruptDpc driver dipanggil, harus menentukan apakah fungsi callback EvtWorkItem telah dijalankan. Jika fungsi panggilan balik EvtWorkItem belum berjalan, fungsi panggilan balik EvtInterruptDpc tidak memanggil WdfWorkItemEnqueue, karena item kerja masih diantrekan. Dalam hal ini, fungsi panggilan balik EvtInterruptDpc hanya memperbarui daftar tindakan untuk fungsi panggilan balik EvtWorkItem .

    Setiap item kerja dikaitkan dengan peranti atau antrean. Ketika perangkat atau antrean terkait dihapus, kerangka kerja menghapus semua item kerja terkait, jadi jika Anda menggunakan teknik ini, driver tidak perlu memanggil WdfObjectDelete.

Beberapa driver mungkin perlu memanggil WdfWorkItemFlush untuk menghapus item kerja mereka dari antrean item kerja. Untuk contoh penggunaan WdfWorkItemFlush, lihat halaman referensi metode.

Jika driver memanggil WdfObjectDelete pada item kerja yang belum diproses, hasilnya tergantung pada status item kerja:

Status item kerja Hasil
Dibuat tetapi tidak diantrekan Item kerja segera dibersihkan.
Diantrikan Panggilan ke WdfObjectDelete menunggu hingga item kerja selesai dieksekusi, lalu item kerja dibersihkan
Mengeksekusi Jika driver memanggil WdfObjectDelete dari dalam EvtWorkItem (pada utas yang sama), WdfObjectDelete akan segera kembali. Setelah EvtWorkItem selesai, item kerja akan dibersihkan. Jika tidak, WdfObjectDelete menunggu EvtWorkItem selesai.