ฟังก์ชัน

ฟังก์ชันในอินเทอร์เฟซ 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>