Model Benang

Metode yang ditandai sebagai oneway tidak menghalangi. Untuk metode yang tidak ditandai sebagai oneway , pemanggilan metode klien akan diblokir hingga server menyelesaikan eksekusi atau disebut panggilan balik sinkron (mana saja yang lebih dulu). Implementasi metode server dapat memanggil paling banyak satu callback sinkron; panggilan balik tambahan akan dibuang dan dicatat sebagai kesalahan. Jika suatu metode seharusnya mengembalikan nilai melalui panggilan balik dan tidak memanggil panggilan baliknya, hal ini dicatat sebagai kesalahan dan dilaporkan sebagai kesalahan transportasi ke klien.

Utas dalam mode passthrough

Dalam mode passthrough, sebagian besar panggilan bersifat sinkron. Namun, untuk mempertahankan perilaku yang diinginkan agar panggilan oneway tidak memblokir klien, thread dibuat untuk setiap proses. Untuk detailnya, lihat ikhtisar HIDL .

Utas dalam HAL yang diikat

Untuk melayani panggilan RPC masuk (termasuk panggilan balik asinkron dari HAL ke pengguna HAL) dan pemberitahuan kematian, threadpool dikaitkan dengan setiap proses yang menggunakan HIDL. Jika suatu proses mengimplementasikan beberapa antarmuka HIDL dan/atau penangan notifikasi kematian, threadpool-nya akan dibagi di antara semuanya. Ketika suatu proses menerima panggilan metode masuk dari klien, proses tersebut mengambil thread gratis dari threadpool dan mengeksekusi panggilan pada thread tersebut. Jika tidak ada thread gratis yang tersedia, thread tersebut akan diblokir hingga tersedia.

Jika server hanya memiliki satu thread, maka panggilan ke server diselesaikan secara berurutan. Server dengan lebih dari satu thread dapat menyelesaikan panggilan secara tidak berurutan meskipun klien hanya memiliki satu thread. Namun, untuk objek antarmuka tertentu, panggilan oneway dijamin akan dipesan (lihat Model threading server ). Untuk server multi-utas yang menampung banyak antarmuka, panggilan oneway ke antarmuka berbeda dapat diproses secara bersamaan satu sama lain atau panggilan pemblokiran lainnya.

Beberapa panggilan bersarang akan dikirim pada thread hwbinder yang sama. Misalnya, jika suatu proses (A) membuat panggilan sinkron dari thread hwbinder ke proses (B), dan kemudian proses (B) membuat panggilan sinkron kembali ke proses (A), panggilan tersebut akan dieksekusi pada thread hwbinder asli di (A) yang diblokir pada panggilan asli. Pengoptimalan ini memungkinkan untuk memiliki satu server berulir yang mampu menangani panggilan bertumpuk, namun tidak mencakup kasus di mana panggilan tersebut berjalan melalui rangkaian panggilan IPC lainnya. Misalnya, jika proses (B) telah membuat panggilan binder/vndbinder yang memanggil proses (C) dan kemudian proses (C) memanggil kembali ke (A), maka proses tersebut tidak dapat dilayani pada thread asli di (A).

Model penguliran server

Kecuali untuk mode passthrough, implementasi server antarmuka HIDL berada dalam proses yang berbeda dari klien dan memerlukan satu atau lebih thread menunggu panggilan metode masuk. Thread ini adalah threadpool server; server dapat memutuskan berapa banyak thread yang ingin dijalankan di threadpool-nya, dan dapat menggunakan threadpool berukuran satu untuk membuat serialisasi semua panggilan pada antarmukanya. Jika server memiliki lebih dari satu thread di threadpool, server dapat menerima panggilan masuk secara bersamaan di salah satu antarmukanya (dalam C++, ini berarti data yang dibagikan harus dikunci dengan hati-hati).

Panggilan satu arah ke antarmuka yang sama diserialkan. Jika klien multi-utas memanggil method1 dan method2 pada antarmuka IFoo , dan method3 pada antarmuka IBar , method1 dan method2 akan selalu diserialkan, namun method3 dapat berjalan secara paralel dengan method1 dan method2 .

Satu thread eksekusi klien dapat menyebabkan eksekusi bersamaan di server dengan banyak thread dalam dua cara:

  • panggilan oneway tidak diblokir. Jika panggilan oneway dijalankan dan kemudian panggilan non- oneway dipanggil, server dapat mengeksekusi panggilan oneway dan panggilan non- oneway secara bersamaan.
  • Metode server yang meneruskan data kembali dengan panggilan balik sinkron dapat membuka blokir klien segera setelah panggilan balik dipanggil dari server.

Untuk cara kedua, kode apa pun dalam fungsi server yang dijalankan setelah panggilan balik dipanggil dapat dijalankan secara bersamaan, dengan server menangani panggilan berikutnya dari klien. Ini termasuk kode dalam fungsi server dan destruktor otomatis yang dijalankan di akhir fungsi. Jika server memiliki lebih dari satu thread di threadpoolnya, masalah konkurensi akan muncul meskipun panggilan masuk hanya dari satu thread klien. (Jika HAL yang dilayani oleh suatu proses memerlukan banyak thread, semua HAL akan memiliki banyak thread karena threadpool dibagikan per proses.)

Segera setelah server memanggil panggilan balik yang disediakan, transport dapat memanggil panggilan balik yang diterapkan pada klien dan membuka blokir klien. Klien melanjutkan secara paralel dengan apa pun yang dilakukan implementasi server setelah memanggil callback (yang mungkin termasuk menjalankan destruktor). Kode dalam fungsi server setelah panggilan balik tidak lagi memblokir klien (selama threadpool server memiliki cukup thread untuk menangani panggilan masuk), tetapi dapat dieksekusi bersamaan dengan panggilan berikutnya dari klien (kecuali threadpool server hanya memiliki satu thread ).

Selain panggilan balik sinkron, panggilan oneway dari klien berulir tunggal dapat ditangani secara bersamaan oleh server dengan beberapa utas di kumpulan utasnya, namun hanya jika panggilan oneway tersebut dijalankan pada antarmuka berbeda. panggilan oneway pada antarmuka yang sama selalu diserialkan.

Catatan: Kami sangat menganjurkan fungsi server untuk kembali segera setelah memanggil fungsi panggilan balik.

Misalnya (dalam C++):

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    // At this point, the client's callback will be called,
    // and the client will resume execution.
    ...
    return Void(); // is basically a no-op
};

Model threading klien

Model threading pada klien berbeda antara panggilan non-pemblokiran (fungsi yang ditandai dengan kata kunci oneway ) dan panggilan pemblokiran (fungsi yang tidak menentukan kata kunci oneway ).

Memblokir panggilan

Untuk memblokir panggilan, klien memblokir hingga salah satu hal berikut terjadi:

  • Terjadi kesalahan transportasi; objek Return berisi status kesalahan yang dapat diambil dengan Return::isOk() .
  • Implementasi server memanggil panggilan balik (jika ada).
  • Implementasi server mengembalikan nilai (jika tidak ada parameter panggilan balik).

Jika berhasil, fungsi panggilan balik yang diteruskan klien sebagai argumen selalu dipanggil oleh server sebelum fungsi itu sendiri kembali. Callback dijalankan pada thread yang sama dengan pemanggilan fungsi, sehingga pelaksana harus berhati-hati dalam menahan kunci selama pemanggilan fungsi (dan menghindarinya sama sekali jika memungkinkan). Fungsi tanpa pernyataan generates atau kata kunci oneway masih memblokir; klien memblokir hingga server mengembalikan objek Return<void> .

Panggilan satu arah

Ketika suatu fungsi ditandai oneway , klien segera kembali dan tidak menunggu server menyelesaikan pemanggilan pemanggilan fungsinya. Pada permukaannya (dan secara agregat), hal ini berarti pemanggilan fungsi memerlukan separuh waktu karena ia mengeksekusi separuh kode, namun saat menulis implementasi yang sensitif terhadap kinerja, hal ini memiliki beberapa implikasi penjadwalan. Biasanya, menggunakan panggilan satu arah menyebabkan pemanggil terus dijadwalkan sedangkan menggunakan panggilan sinkron normal menyebabkan penjadwal segera mentransfer dari pemanggil ke proses yang dipanggil. Ini adalah optimasi kinerja dalam binder. Untuk layanan yang panggilan satu arah harus dijalankan dalam proses target dengan prioritas tinggi, kebijakan penjadwalan layanan penerima dapat diubah. Di C++, menggunakan metode libhidltransport setMinSchedulerPolicy dengan prioritas dan kebijakan penjadwal yang ditentukan dalam sched.h memastikan bahwa semua panggilan ke layanan berjalan setidaknya pada kebijakan dan prioritas penjadwalan yang ditetapkan.