ฟังก์ชัน

ฟังก์ชันในอินเทอร์เฟซ HIDL จะแมปกับวิธีการในการสร้างโดยอัตโนมัติ การประกาศคลาส C++ IFoo รายการ ชื่อของแต่ละฟังก์ชันจะยังคงเป็น เหมือนกันใน C++ ส่วนต่อไปนี้จะอธิบายวิธีที่อาร์กิวเมนต์ HIDL และการส่งกลับ จะได้รับการแปลเป็น C++

พารามิเตอร์ฟังก์ชัน

อาร์กิวเมนต์ที่แสดงในไฟล์ .hal จะแมปกับข้อมูลประเภท C++ อาร์กิวเมนต์ที่ไม่ได้แมปกับประเภท C++ พื้นฐานจะส่งผ่านด้วย const ข้อมูลอ้างอิง

สำหรับฟังก์ชัน HIDL ทุกฟังก์ชันที่มีค่าการแสดงผล (มี generates ) รายการพารามิเตอร์ C++ สำหรับฟังก์ชันนั้นจะมีอาร์กิวเมนต์เพิ่มเติมดังนี้ ฟังก์ชัน Callback ที่ถูกเรียกด้วยค่าที่ส่งกลับของฟังก์ชัน HIDL โดยจะมีข้อยกเว้น 1 ข้อ คือ หากวรรค generates มีพารามิเตอร์เดียวที่แมปกับ C++ Primitive โดยตรง ซึ่งเรียกว่า Callback ใช้ elision (นำ Callback ออกและค่าที่ส่งกลับคือ ที่แสดงผลจากฟังก์ชันผ่านคำสั่ง return ปกติ)

ค่าที่แสดงผลของฟังก์ชัน

ฟังก์ชันต่อไปนี้มีค่าแสดงผล

ข้อผิดพลาดในการขนส่งและประเภทการคืนสินค้า

คำสั่ง generates จะส่งผลกับฟังก์ชัน 3 ประเภท ลายเซ็น:

  • สำหรับผลลัพธ์เพียงค่าเดียวที่เป็น Primitive ของ C++ พารามิเตอร์ ฟังก์ชันของฟังก์ชันในฟังก์ชันจะส่งกลับค่า generates Return<T> ออบเจ็กต์
  • สำหรับกรณีที่ซับซ้อนมากขึ้น ผลลัพธ์ generates รายการจะเป็น แสดงผลผ่านพารามิเตอร์ Callback ที่ให้ไว้พร้อมกับการเรียกใช้ฟังก์ชัน และฟังก์ชันแสดงผล Return<void>
  • ในกรณีที่ไม่มีคำสั่ง generates ฟังก์ชันจะแสดงผล Return<void>

การเรียกใช้ RPC อาจพบข้อผิดพลาดในการส่งในบางครั้ง เช่น เมื่อเซิร์ฟเวอร์ ตาย เมื่อทรัพยากรในการขนส่งไม่เพียงพอต่อการเรียกให้เสร็จสมบูรณ์ หรือเมื่อ พารามิเตอร์ที่ส่งผ่านไม่อนุญาตให้ทำการเรียกให้เสร็จสมบูรณ์ (เช่น ไม่มี ฟังก์ชัน Callback ที่ต้องใช้) เกิดข้อผิดพลาดในการขนส่งออบเจ็กต์ Return รายการ รวมถึงค่า T (ยกเว้น Return<void>)

เนื่องจากฟังก์ชันฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์มีลายเซ็นเดียวกัน ฟังก์ชันฝั่งเซิร์ฟเวอร์ต้องแสดงผลประเภท Return แม้ว่า ไม่ได้ส่งสัญญาณข้อผิดพลาดในการรับส่ง Return<T> ออบเจ็กต์สร้างขึ้นด้วย Return(myTValue) (หรือโดยนัย สร้างขึ้นจาก mTValue เช่น ใน return คำสั่ง) และ Return<void> ออบเจ็กต์ถูกสร้างขึ้นด้วย Void()

ออบเจ็กต์ Return<T> รายการมีการแปลงโดยนัยเป็นและจาก ค่า T ตรวจสอบออบเจ็กต์ Return ได้ ข้อผิดพลาดในการส่งด้วยการเรียกใช้เมธอด isOk() การตรวจสอบนี้ ต้องระบุ แต่หากเกิดข้อผิดพลาดและไม่มีการตรวจสอบภายใน ออบเจ็กต์ Return ถูกทำลาย หรือ Conversion มูลค่า T มีค่า พยายามแล้ว กระบวนการของไคลเอ็นต์จะหยุดทำงานและจะมีการบันทึกข้อผิดพลาด ถ้า isOk() บ่งชี้ข้อผิดพลาดในการส่งหรือการโทรล้มเหลวเนื่องจากตรรกะ ข้อผิดพลาดในโค้ดนักพัฒนาซอฟต์แวร์ (เช่น การส่ง nullptr ในแบบซิงโครนัส callback) แล้วสามารถเรียกใช้ description() ในออบเจ็กต์ Return ไปยัง แสดงผลสตริงที่เหมาะสำหรับการบันทึก ในกรณีดังกล่าว จะไม่มีทางที่ กำหนดจำนวนโค้ดที่จะเรียกใช้บนเซิร์ฟเวอร์ซึ่งเป็นผลมาจาก สายที่ล้มเหลว นอกจากนี้ คุณยังระบุเมธอด isDeadObject() ได้ด้วย ช่วงเวลานี้ บ่งบอกว่า !isOk() เป็นเพราะวัตถุระยะไกลมี ขัดข้องหรือไม่มีอยู่อีกต่อไป isDeadObject() กล่าวเป็นนัยเสมอ !isOk()

แสดงผลตามค่า

ถ้าคำสั่ง generates แมปกับ C++ พื้นฐานตัวเดียว จะไม่มี พารามิเตอร์ Callback อยู่ในรายการพารามิเตอร์ แต่การนำไปใช้จะให้ ผลลัพธ์ T ในออบเจ็กต์ Return<T> ซึ่ง อาจสร้างขึ้นโดยปริยายจากประเภทพื้นฐาน T สำหรับ ตัวอย่าง:

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

นอกจากนี้ คุณยังระบุเมธอด Return<*>::withDefault ได้ด้วย ช่วงเวลานี้ ให้ค่าในกรณีที่ค่าผลลัพธ์เป็น !isOk() วิธีการนี้ยังทำเครื่องหมายอ็อบเจกต์การแสดงผลว่าตกลงโดยอัตโนมัติด้วยเพื่อให้ไคลเอ็นต์ จะไม่ถูกปิด

ส่งคืนโดยใช้พารามิเตอร์ Callback

Callback จะส่งค่าที่ส่งกลับของฟังก์ชัน HIDL กลับไปยังผู้โทร ต้นแบบของ Callback คือออบเจ็กต์ std::function ที่มี (นำมาจากคำสั่ง generates) ที่แมปกับ C++ ประเภทต่างๆ ผลลัพธ์จะเป็นโมฆะ เนื่องจาก Callback จะไม่แสดงผลค่า

ค่าที่ส่งกลับของฟังก์ชัน C++ ที่มีพารามิเตอร์ Callback มีประเภท Return<void> เฉพาะการใช้งานเซิร์ฟเวอร์ สำหรับการระบุมูลค่าผลลัพธ์ เนื่องจากมีการโอนมูลค่าการคืนสินค้าแล้ว โดยใช้ Callback พารามิเตอร์เทมเพลต T คือ void:

Return<void> someMethod(someMethod_cb _cb);

จากการใช้งาน C++ การติดตั้งใช้งานเซิร์ฟเวอร์ควรให้ผลลัพธ์เป็น Void() ซึ่งเป็นฟังก์ชันในบรรทัดแบบคงที่ซึ่งแสดงผล Return<void> ออบเจ็กต์ ตัวอย่างเมธอดของเซิร์ฟเวอร์ทั่วไป การใช้งานที่มีพารามิเตอร์ 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();
};

ฟังก์ชันที่ไม่มีค่าส่งกลับ

ลายเซ็น C++ ของฟังก์ชันที่ไม่มีคำสั่ง generates จะไม่มีพารามิเตอร์ Callback ในรายการพารามิเตอร์ ประเภทการแสดงผลจะ เป็น Return<void>.

ฟังก์ชันทางเดียว

ฟังก์ชันที่มีเครื่องหมายคีย์เวิร์ด oneway จะเป็นแบบไม่พร้อมกัน (ไคลเอ็นต์จะไม่บล็อกเมื่อดำเนินการกับการดำเนินการ) และไม่มีฟังก์ชัน Return ลายเซ็น C++ ของฟังก์ชัน oneway จะไม่มี พารามิเตอร์ Callback ในรายการพารามิเตอร์และค่า C++ ที่แสดงผลจะเป็น Return<void>