Persyaratan Seumur Hidup Objek NDKPI

Cara Objek NDK Dibuat, Digunakan, dan Ditutup

Konsumen NDK memulai permintaan buat untuk objek NDK dengan memanggil fungsi buat penyedia NDK untuk objek tersebut.

Ketika konsumen memanggil fungsi buat, ia melewati NdkCreateCompletion (NDK_FN_CREATE_COMPLETION) sebagai parameter.

Konsumen memulai berbagai permintaan dengan memanggil fungsi penyedia dalam tabel pengiriman objek, melewati panggilan balik penyelesaian NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION) sebagai parameter.

Ketika objek tidak lagi diperlukan, konsumen memanggil fungsi NdkCloseObject (NDK_FN_CLOSE_OBJECT) penyedia untuk memulai permintaan dekat untuk objek, melewati panggilan balik NdkCloseCompletion (NDK_FN_CLOSE_COMPLETION) sebagai parameter.

Penyedia memanggil fungsi panggilan balik konsumen untuk menyelesaikan permintaan secara asinkron. Panggilan ini menunjukkan kepada konsumen bahwa penyedia telah menyelesaikan operasi (misalnya, menutup objek) dan mengembalikan kontrol kepada konsumen. Jika penyedia menyelesaikan permintaan penutupan secara sinkron, baik berhasil atau dalam kesalahan, penyedia tidak akan memanggil fungsi panggilan balik konsumen.

Aturan untuk Panggilan Balik Penyelesaian

Ketika penyedia telah membuat objek atas permintaan konsumen, penyedia memanggil panggilan balik NdkCreateCompletion konsumen untuk menunjukkan bahwa objek siap digunakan.

Konsumen dapat memanggil fungsi penyedia lain untuk objek yang sama tanpa menunggu panggilan balik pertama kembali.

Konsumen tidak akan memanggil fungsi NdkCloseObject untuk objek sampai semua fungsi penyedia untuk objek tersebut telah kembali.

Namun, jika fungsi penyedia memulai permintaan penyelesaian, konsumen bebas untuk memanggil NdkCloseObject dari dalam panggilan balik penyelesaian tersebut, bahkan jika fungsi penyedia belum dikembalikan.

Fungsi penyedia dapat memulai permintaan penyelesaian sebelum kembali dari panggilan balik dengan melakukan salah satu hal berikut:

  • Memanggil panggilan balik penyelesaian secara langsung
  • Mengantrekan permintaan penyelesaian ke utas lain

Dengan memulai permintaan penyelesaian, penyedia secara efektif mengembalikan kontrol kepada konsumen. Penyedia harus berasumsi bahwa objek dapat ditutup kapan saja setelah penyedia memulai permintaan penyelesaian.

Catatan Untuk mencegah kebuntuan setelah memulai permintaan penyelesaian, penyedia harus:

  • Tidak melakukan operasi lain pada objek sampai panggilan balik penyelesaian kembali.
  • Ambil langkah-langkah yang diperlukan untuk menjaga objek tetap utuh, jika penyedia benar-benar harus menyentuh objek .

Contoh: Interaksi Consumer-Provider

Pertimbangkan skenario berikut:

  1. Konsumen membuat konektor (NDK_CONNECTOR) lalu memanggil NdkConnect (NDK_FN_CONNECT).
  2. Penyedia memproses permintaan koneksi, mengalami kegagalan, dan memanggil panggilan balik penyelesaian konsumen dalam konteks panggilan NdkConnect (dibandingkan dengan mengembalikan kegagalan sebaris karena pilihan implementasi internal).
  3. Konsumen memanggil NdkCloseObject dalam konteks panggilan balik penyelesaian ini, meskipun panggilan NdkConnect belum dikembalikan ke konsumen.

Untuk menghindari kebuntuan, penyedia tidak boleh menyentuh objek konektor setelah langkah 2 (titik ketika memulai panggilan balik penyelesaian di dalam panggilan NdkConnect ).

Menutup Objek Antecedent dan Successor

Penyedia harus siap bagi konsumen untuk memanggil fungsi NdkCloseObject untuk menutup objek antecedent sebelum konsumen memanggil NdkCloseObject untuk objek penerus. Jika konsumen melakukan ini, inilah yang harus dilakukan penyedia:

  • Penyedia tidak boleh menutup objek antecedent sampai semua objek penerus ditutup, yaitu, penyedia harus mengembalikan STATUS_PENDING dari permintaan tutup dan menyelesaikannya (dengan memanggil fungsi NdkCloseCompletion terdaftar untuk permintaan penutupan) setelah semua objek penerus ditutup.
  • Konsumen tidak akan menggunakan objek antecedent setelah memanggil NdkCloseObject di atasnya, sehingga penyedia tidak perlu menambahkan penanganan apa pun untuk gagal fungsi penyedia lebih lanjut pada objek antecedent (tetapi mungkin jika ia memilih).
  • Penyedia dapat memperlakukan permintaan dekat seperti dereferensi sederhana yang tidak memiliki efek samping lain sampai objek penerus terakhir ditutup, kecuali jika diperlukan lain (lihat kasus penutupan pendengar NDK di bawah ini yang memiliki efek samping yang diperlukan).

Penyedia tidak boleh menyelesaikan permintaan penutupan pada objek antecedent (termasuk permintaan penutupan NDK_ADAPTER ) sebelum panggilan balik penyelesaian penutupan yang sedang berlangsung pada objek penerus apa pun kembali ke penyedia. Hal ini untuk memungkinkan konsumen NDK untuk membongkar dengan aman.

Konsumen NDK tidak akan memanggil NdkCloseObject untuk objek NDK_ADAPTER (yang merupakan panggilan pemblokiran) dari dalam fungsi panggilan balik konsumen.

Menutup Objek Adapter

Pertimbangkan skenario berikut:

  1. Konsumen memanggil NdkCloseObject pada objek antrean penyelesaian (CQ).
  2. Penyedia mengembalikan STATUS_PENDING, dan kemudian memanggil panggilan balik penyelesaian konsumen.
  3. Di dalam panggilan balik penyelesaian ini, konsumen memberi sinyal peristiwa bahwa sekarang ok untuk menutup NDK_ADAPTER.
  4. Utas lain bangun setelah sinyal ini, dan menutup NDK_ADAPTER dan melanjutkan untuk membongkar.
  5. Namun, utas di mana panggilan balik penyelesaian penutupan CQ konsumen disebut mungkin masih berada di dalam fungsi panggilan balik konsumen (misalnya, epilog fungsi), sehingga tidak aman bagi driver konsumen untuk membongkar.
  6. Karena konteks panggilan balik penyelesaian adalah satu-satunya konteks yang dapat disinyalkan konsumen peristiwa, driver konsumen tidak dapat menyelesaikan masalah pembongkaran aman itu sendiri.

Harus ada titik di mana konsumen dapat yakin bahwa semua panggilan baliknya telah mengembalikan kontrol. Di NDKPI, titik ini adalah ketika permintaan penutupan pada NDK_ADAPTER mengembalikan kontrol. Perhatikan bahwa permintaan penutupan NDK_ADAPTER adalah panggilan pemblokiran. Ketika permintaan penutupan NDK_ADAPTER kembali, dijamin bahwa semua panggilan balik pada semua objek yang turun dari objek NDK_ADAPTER tersebut telah mengembalikan kontrol ke penyedia.

Menyelesaikan Permintaan Tutup

Penyedia tidak boleh menyelesaikan permintaan tutup pada objek hingga:

  • Semua permintaan asinkron yang tertunda pada objek telah selesai (dengan kata lain, panggilan balik penyelesaiannya telah kembali ke penyedia).
  • Semua panggilan balik peristiwa konsumen (misalnya, NdkCqNotificationCallback (NDK_FN_CQ_NOTIFICATION_CALLBACK) pada CQ, NdkConnectEventCallback (NDK_FN_CONNECT_EVENT_CALLBACK) pada Listener) telah kembali ke penyedia.

Penyedia harus menjamin bahwa tidak ada lagi panggilan balik yang akan terjadi setelah panggilan balik penyelesaian penutupan dipanggil atau setelah permintaan penutupan mengembalikan STATUS_SUCCESS. Perhatikan bahwa permintaan penutupan juga harus memulai pembersihan atau pembatalan permintaan asinkron yang tertunda yang diperlukan.

Catatan Secara logis mengikuti dari atas bahwa konsumen NDK tidak boleh memanggil NdkCloseObject untuk objek NDK_ADAPTER (yang merupakan panggilan pemblokiran) dari dalam fungsi panggilan balik konsumen.

Antarmuka Penyedia Kernel Langsung Jaringan (NDKPI)