ฟังก์ชันในอินเทอร์เฟซ HIDL ถูกแมปกับวิธีการในการประกาศคลาส IFoo
C++ ที่สร้างขึ้นโดยอัตโนมัติ ชื่อของแต่ละฟังก์ชันยังคงเหมือนเดิมในภาษา C++; ส่วนต่อไปนี้จะอธิบายวิธีการแปลอาร์กิวเมนต์ HIDL และค่าที่ส่งคืนเป็น C++
พารามิเตอร์ฟังก์ชัน
อาร์กิวเมนต์ที่แสดงอยู่ในไฟล์ .hal
จะแมปกับประเภทข้อมูล C++ อาร์กิวเมนต์ที่ไม่ได้แมปกับประเภท C++ ดั้งเดิมจะถูกส่งผ่านโดยการอ้างอิง const
สำหรับฟังก์ชัน HIDL ทุกฟังก์ชันที่มีค่าส่งคืน (มีคำสั่ง generates
) รายการพารามิเตอร์ C++ สำหรับฟังก์ชันนั้นจะมีอาร์กิวเมนต์เพิ่มเติม: ฟังก์ชันเรียกกลับที่ถูกเรียกด้วยค่าที่ส่งคืนของฟังก์ชัน HIDL มี ข้อยกเว้นประการหนึ่ง : หาก generates
clause มีพารามิเตอร์ตัวเดียวที่แมปกับ C++ ดั้งเดิมโดยตรง จะมีการใช้ Callback Elision (การเรียกกลับจะถูกลบออก และค่าที่ส่งคืนจะถูกส่งกลับจากฟังก์ชันผ่านคำสั่ง return
ปกติ)
ค่าส่งคืนฟังก์ชัน
ฟังก์ชันต่อไปนี้มีค่าส่งคืน
ข้อผิดพลาดในการขนส่งและประเภทการส่งคืน
คำสั่ง generates
สามารถส่งผลให้มีลายเซ็นฟังก์ชันสามประเภท:
- สำหรับค่าที่ส่งคืนเพียงค่าเดียวที่เป็นค่าดั้งเดิมของ C++ ค่าที่ส่งคืน
generates
จะถูกส่งกลับโดยค่าจากฟังก์ชันในอ็อบเจ็กต์Return<T>
- สำหรับกรณีที่ซับซ้อนมากขึ้น ค่าที่ส่งคืน
generates
จะถูกส่งกลับผ่านพารามิเตอร์การเรียกกลับที่มาพร้อมกับการเรียกใช้ฟังก์ชันเอง และฟังก์ชันจะส่งคืนReturn<void>
- สำหรับเมื่อไม่มีคำสั่ง
generates
ฟังก์ชันจะส่งคืนReturn<void>
การเรียก RPC อาจพบข้อผิดพลาดในการขนส่งในบางครั้ง เช่น เมื่อเซิร์ฟเวอร์หยุดทำงาน เมื่อทรัพยากรการขนส่งไม่เพียงพอต่อการเรียกให้เสร็จสิ้น หรือเมื่อพารามิเตอร์ที่ส่งผ่านไม่อนุญาตให้ทำการเรียกให้เสร็จสิ้น (เช่น ฟังก์ชันการเรียกกลับที่จำเป็นหายไป) Return
วัตถุบ่งชี้ข้อผิดพลาดในการขนส่งที่เก็บเช่นเดียวกับค่า T
(ยกเว้น Return<void>
)
เนื่องจากฟังก์ชันฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์มีลายเซ็นเดียวกัน ฟังก์ชันฝั่งเซิร์ฟเวอร์จะต้องส่งคืนชนิด Return
แม้ว่าการใช้งานจะไม่ส่งสัญญาณข้อผิดพลาดในการขนส่งก็ตาม อ็อบเจ็กต์ Return<T>
ถูกสร้างขึ้นด้วย Return(myTValue)
(หรือสามารถสร้างโดยนัยจาก mTValue
เช่นในคำสั่ง return
) และอ็อบเจ็กต์ Return<void>
ถูกสร้างขึ้นด้วย Void()
วัตถุ Return<T>
มีการแปลงโดยนัยเป็นและจากค่า T
สามารถตรวจสอบวัตถุ Return
เพื่อหาข้อผิดพลาดในการขนส่งได้โดยการเรียกเมธอด isOk()
ไม่จำเป็นต้องมีการตรวจสอบนี้ อย่างไรก็ตาม หากมีข้อผิดพลาดเกิดขึ้นและไม่ได้รับการตรวจสอบตามเวลาที่ออบเจ็กต์ Return
ถูกทำลาย หรือมีความพยายามในการแปลงค่า T
กระบวนการไคลเอ็นต์จะถูกปิดและบันทึกข้อผิดพลาด หาก isOk()
บ่งชี้ว่ามีข้อผิดพลาดในการขนส่งหรือการโทรล้มเหลวเนื่องจากข้อผิดพลาดทางตรรกะในโค้ดของนักพัฒนา (เช่น การส่ง nullptr
เป็นการโทรกลับแบบซิงโครนัส) ก็สามารถเรียกใช้ description()
บนออบเจ็กต์ Return เพื่อส่งคืนสตริงที่เหมาะสมสำหรับการบันทึก ในกรณีเช่นนี้ ไม่มีวิธีใดที่จะระบุจำนวนโค้ดที่อาจมีการเรียกใช้งานบนเซิร์ฟเวอร์อันเป็นผลมาจากการโทรที่ล้มเหลว นอกจากนี้ยังมีการจัดเตรียมเมธอด isDeadObject()
ไว้ด้วย วิธีการนี้บ่งชี้ว่า !isOk()
เป็นเพราะวัตถุระยะไกลเสียหายหรือไม่มีอยู่อีกต่อไป isDeadObject()
มีความหมายเป็นนัยเสมอ !isOk()
ส่งกลับตามมูลค่า
หากคำสั่ง generates
แมปกับ C++ ดั้งเดิมตัวเดียว จะไม่มีพารามิเตอร์การเรียกกลับอยู่ในรายการพารามิเตอร์ แต่การใช้งานจะให้ค่าส่งคืน T
ในอ็อบเจ็กต์ Return<T>
ซึ่งสามารถสร้างขึ้นโดยปริยายจากประเภทดั้งเดิม T
ตัวอย่างเช่น:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
นอกจากนี้ยังมีการจัดเตรียมเมธอด Return<*>::withDefault
ไว้ด้วย เมธอดนี้จัดเตรียมค่าในกรณีที่ค่าที่ส่งคืนคือ !isOk()
วิธีนี้ยังทำเครื่องหมายออบเจ็กต์ที่ส่งคืนว่าโอเคโดยอัตโนมัติ ดังนั้นกระบวนการของไคลเอ็นต์จะไม่ถูกฆ่า
กลับโดยใช้พารามิเตอร์การโทรกลับ
การโทรกลับสามารถส่งค่าส่งคืนของฟังก์ชัน HIDL กลับไปยังผู้เรียกได้ ต้นแบบของการเรียกกลับคือวัตถุ std::function
พร้อมพารามิเตอร์ (นำมาจากคำสั่ง generates
) ที่แมปกับประเภท C ++ ค่าที่ส่งคืนจะเป็นโมฆะ—ตัวโทรกลับเองจะไม่ส่งคืนค่า
ค่าที่ส่งคืนของฟังก์ชัน C++ พร้อมพารามิเตอร์การเรียกกลับมีประเภท Return<void>
การใช้งานเซิร์ฟเวอร์มีหน้าที่รับผิดชอบในการจัดเตรียมค่าตอบแทนเท่านั้น เนื่องจากค่าที่ส่งคืนถูกถ่ายโอนโดยใช้การโทรกลับแล้ว พารามิเตอร์เทมเพลต T
จึงเป็น void
:
Return<void> someMethod(someMethod_cb _cb);
จากการใช้งาน C ++ การใช้งานเซิร์ฟเวอร์ควรส่งคืน Void()
ซึ่งเป็นฟังก์ชันอินไลน์แบบคงที่ที่ส่งคืนอ็อบเจ็กต์ Return<void>
ตัวอย่างการใช้งานเมธอดเซิร์ฟเวอร์ทั่วไปพร้อมพารามิเตอร์โทรกลับ:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
ฟังก์ชันที่ไม่มีค่าส่งคืน
ลายเซ็น C++ ของฟังก์ชันที่ไม่มีคำสั่ง generates
จะไม่มีพารามิเตอร์การเรียกกลับในรายการพารามิเตอร์ ประเภทการส่งคืนจะเป็น Return<void>.
ฟังก์ชั่นวันเวย์
ฟังก์ชันที่ทำเครื่องหมายด้วยคำสำคัญ oneway
เป็นฟังก์ชันแบบอะซิงโครนัส (ไคลเอ็นต์จะไม่บล็อกการดำเนินการ) และไม่มีค่าส่งคืน ลายเซ็น C++ ของฟังก์ชัน oneway
จะไม่มีพารามิเตอร์การเรียกกลับในรายการพารามิเตอร์ และค่าที่ส่งคืนของ C++ จะเป็น Return<void>