Fungsi

Fungsi dalam antarmuka HIDL dipetakan ke metode dalam deklarasi kelas IFoo C++ yang dibuat secara otomatis. Nama setiap fungsi tetap sama di C++; bagian berikut menjelaskan bagaimana argumen HIDL dan nilai kembalian diterjemahkan ke C++.

Parameter fungsi

Argumen yang tercantum dalam file .hal dipetakan ke tipe data C++. Argumen yang tidak dipetakan ke tipe C++ primitif diteruskan dengan referensi const.

Untuk setiap fungsi HIDL yang memiliki nilai kembalian (memiliki pernyataan generates ), daftar parameter C++ untuk fungsi tersebut memiliki argumen tambahan: fungsi panggilan balik yang dipanggil dengan nilai kembalian fungsi HIDL. Ada satu pengecualian : Jika klausa generates berisi parameter tunggal yang secara langsung dipetakan ke primitif C++, callback elision digunakan (callback dihapus dan nilai kembalian dikembalikan dari fungsi melalui pernyataan return normal).

Nilai pengembalian fungsi

Fungsi berikut memiliki nilai kembalian.

Kesalahan transportasi dan jenis pengembalian

Pernyataan generates dapat menghasilkan tiga jenis tanda tangan fungsi:

  • Hanya untuk satu nilai kembalian yang merupakan primitif C++, nilai kembalian generates dikembalikan berdasarkan nilai dari fungsi dalam objek Return<T> .
  • Untuk kasus yang lebih rumit, nilai kembalian generates dikembalikan melalui parameter panggilan balik yang disediakan dengan pemanggilan fungsi itu sendiri, dan fungsi tersebut mengembalikan Return<void> .
  • Karena ketika tidak ada pernyataan generates , fungsi akan mengembalikan Return<void> .

Panggilan RPC kadang-kadang dapat mengalami kesalahan transportasi, misalnya ketika server mati, ketika sumber daya transportasi tidak mencukupi untuk menyelesaikan panggilan, atau ketika parameter yang diteruskan tidak mengizinkan penyelesaian panggilan (seperti kehilangan fungsi panggilan balik yang diperlukan). Objek Return menyimpan indikasi kesalahan pengangkutan serta nilai T (kecuali Return<void> ).

Karena fungsi sisi klien dan sisi server memiliki tanda tangan yang sama, fungsi sisi server harus mengembalikan tipe Return meskipun implementasinya tidak menandakan kesalahan transportasi. Objek Return<T> dibuat dengan Return(myTValue) (atau dapat dibuat secara implisit dari mTValue , seperti dalam pernyataan return ) dan objek Return<void> dibuat dengan Void() .

Objek Return<T> memiliki konversi implisit ke dan dari nilai T -nya. Objek Return dapat diperiksa kesalahan pengangkutannya dengan memanggil metode isOk() -nya. Pemeriksaan ini tidak diperlukan; namun, jika kesalahan terjadi dan tidak diperiksa pada saat objek Return dihancurkan, atau konversi nilai T dicoba, proses klien akan dihentikan dan kesalahan dicatat. Jika isOk() menunjukkan kesalahan transportasi atau kegagalan panggilan karena kesalahan logika dalam kode pengembang (seperti meneruskan nullptr sebagai panggilan balik sinkron), maka description() dapat dipanggil pada objek Return untuk mengembalikan string yang sesuai untuk logging. Dalam kasus seperti ini, tidak ada cara untuk menentukan berapa banyak kode yang mungkin telah dieksekusi di server sebagai akibat dari panggilan yang gagal. Metode isDeadObject() juga disediakan. Metode ini menunjukkan bahwa !isOk() karena objek jarak jauh telah mogok atau tidak ada lagi. isDeadObject() selalu menyiratkan !isOk() .

Kembalikan berdasarkan nilai

Jika pernyataan generates peta ke satu primitif C++, tidak ada parameter panggilan balik dalam daftar parameter. Sebaliknya, implementasi memberikan nilai kembalian T dalam objek Return<T> , yang secara implisit dapat dihasilkan dari tipe primitif T . Misalnya:

Return<uint32_t> someMethod() {
    uint32_t return_data = ...; // Compute return_data
    return return_data;
};

Metode Return<*>::withDefault juga disediakan. Metode ini memberikan nilai jika nilai yang dikembalikan adalah !isOk() . Metode ini juga secara otomatis menandai objek yang dikembalikan sebagai oke sehingga proses klien tidak akan terhenti.

Kembali menggunakan parameter panggilan balik

Panggilan balik dapat meneruskan nilai kembalian fungsi HIDL kembali ke pemanggil. Prototipe callback adalah objek std::function dengan parameter (diambil dari pernyataan generates ) yang dipetakan ke tipe C++. Nilai pengembaliannya tidak berlaku—callback itu sendiri tidak mengembalikan nilai.

Nilai kembalian fungsi C++ dengan parameter panggilan balik memiliki tipe Return<void> . Implementasi server hanya bertanggung jawab untuk menyediakan nilai kembalian. Karena nilai kembalian sudah ditransfer menggunakan callback, parameter template T adalah void :

Return<void> someMethod(someMethod_cb _cb);

Dari implementasi C++, implementasi server harus mengembalikan Void() , yang merupakan fungsi sebaris statis yang mengembalikan objek Return<void> . Contoh implementasi metode server pada umumnya dengan parameter callback:

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    return Void();
};

Fungsi tanpa nilai kembalian

Tanda tangan C++ dari suatu fungsi tanpa pernyataan generates tidak akan memiliki parameter panggilan balik dalam daftar parameter. Jenis pengembaliannya adalah Return<void>.

Fungsi satu arah

Fungsi yang ditandai dengan kata kunci oneway adalah fungsi asinkron (klien tidak akan memblokir eksekusinya) dan tidak memiliki nilai kembalian. Tanda tangan C++ dari fungsi oneway tidak akan memiliki parameter panggilan balik dalam daftar parameter, dan nilai kembalian C++-nya adalah Return<void> .