Hàm

Các hàm trong giao diện HIDL được ánh xạ tới các phương thức trong khai báo lớp IFoo C++ được tạo tự động. Tên của từng hàm vẫn giữ nguyên trong C++; các phần sau đây mô tả cách dịch các đối số và giá trị trả về HIDL sang C++.

Thông số chức năng

Các đối số được liệt kê trong tệp .hal ánh xạ tới các kiểu dữ liệu C++. Các đối số không ánh xạ tới kiểu C++ nguyên thủy được truyền bằng tham chiếu const.

Đối với mỗi hàm HIDL có giá trị trả về (có câu lệnh generates ), danh sách tham số C++ cho hàm đó có một đối số bổ sung: hàm gọi lại được gọi với các giá trị trả về của hàm HIDL. Có một ngoại lệ : Nếu mệnh đề generates chứa một tham số duy nhất ánh xạ trực tiếp tới nguyên hàm C++, thì phép chọn lọc gọi lại được sử dụng (gọi lại bị loại bỏ và giá trị trả về được trả về từ hàm thông qua câu lệnh return thông thường).

Giá trị trả về của hàm

Các hàm sau đây có giá trị trả về.

Lỗi vận chuyển và kiểu trả về

Câu lệnh generates có thể dẫn đến ba loại chữ ký hàm:

  • Đối với chỉ một giá trị trả về là giá trị gốc C++, giá trị trả về generates sẽ được trả về theo giá trị từ hàm trong đối tượng Return<T> .
  • Đối với các trường hợp phức tạp hơn, (các) giá trị trả về generates sẽ được trả về thông qua tham số gọi lại được cung cấp cùng với chính lệnh gọi hàm và hàm trả về Return<void> .
  • Vì khi không có câu lệnh generates nào tồn tại, hàm sẽ trả về Return<void> .

Các cuộc gọi RPC đôi khi có thể gặp phải lỗi truyền tải, ví dụ như khi máy chủ ngừng hoạt động, khi tài nguyên truyền tải không đủ để hoàn thành cuộc gọi hoặc khi các tham số được truyền không cho phép hoàn thành cuộc gọi (chẳng hạn như thiếu chức năng gọi lại bắt buộc). Đối tượng Return lưu trữ các chỉ báo lỗi vận chuyển cũng như giá trị T (ngoại trừ Return<void> ).

Vì các hàm phía máy khách và phía máy chủ có cùng chữ ký nên hàm phía máy chủ phải trả về kiểu Return ngay cả khi việc triển khai nó không báo hiệu lỗi truyền tải. Các đối tượng Return<T> được xây dựng bằng Return(myTValue) (hoặc có thể được xây dựng ngầm từ mTValue , chẳng hạn như trong câu lệnh return ) và các đối tượng Return<void> được xây dựng bằng Void() .

Các đối tượng Return<T> có sự chuyển đổi tiềm ẩn sang và từ giá trị T của chúng. Đối tượng Return có thể được kiểm tra lỗi truyền tải bằng cách gọi phương thức isOk() của nó. Việc kiểm tra này là không bắt buộc; tuy nhiên, nếu xảy ra lỗi và không được kiểm tra vào thời điểm đối tượng Return bị hủy hoặc cố gắng chuyển đổi giá trị T thì quy trình máy khách sẽ bị hủy và lỗi được ghi lại. Nếu isOk() chỉ ra lỗi truyền tải hoặc lỗi cuộc gọi do lỗi logic trong mã nhà phát triển (chẳng hạn như chuyển nullptr dưới dạng lệnh gọi lại đồng bộ), thì có thể gọi description() trên đối tượng Return để trả về một chuỗi phù hợp cho việc ghi nhật ký. Trong những trường hợp như vậy, không có cách nào để xác định số lượng mã có thể đã được thực thi trên máy chủ do lệnh gọi không thành công. Phương thức isDeadObject() cũng được cung cấp. Phương thức này chỉ ra rằng !isOk() là do đối tượng từ xa đã bị hỏng hoặc không còn tồn tại. isDeadObject() luôn ngụ ý !isOk() .

Trả về theo giá trị

Nếu câu lệnh generates ánh xạ tới một nguyên hàm C++ duy nhất thì không có tham số gọi lại nào có trong danh sách tham số. Thay vào đó, việc triển khai cung cấp giá trị trả về T trong đối tượng Return<T> , giá trị này có thể được tạo ngầm từ kiểu nguyên thủy T . Ví dụ:

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

Phương thức Return<*>::withDefault cũng được cung cấp. Phương thức này cung cấp một giá trị trong trường hợp giá trị trả về là !isOk() . Phương thức này cũng tự động đánh dấu đối tượng trả về là ổn nên tiến trình máy khách sẽ không bị hủy.

Trả về bằng tham số gọi lại

Lệnh gọi lại có thể chuyển giá trị trả về của hàm HIDL lại cho người gọi. Nguyên mẫu của lệnh gọi lại là một đối tượng std::function với các tham số (lấy từ câu lệnh generates ) được ánh xạ tới các kiểu C++. Giá trị trả về của nó là void—bản thân lệnh gọi lại không trả về giá trị.

Giá trị trả về của hàm C++ với tham số gọi lại có loại Return<void> . Việc triển khai máy chủ chỉ chịu trách nhiệm cung cấp giá trị trả về. Vì các giá trị trả về đã được chuyển bằng lệnh gọi lại nên tham số mẫu Tvoid :

Return<void> someMethod(someMethod_cb _cb);

Từ việc triển khai C++ của họ, việc triển khai máy chủ sẽ trả về Void() , đây là một hàm nội tuyến tĩnh trả về một đối tượng Return<void> . Ví dụ về cách triển khai phương thức máy chủ điển hình với tham số gọi lại:

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

Hàm không có giá trị trả về

Chữ ký C++ của hàm không có câu lệnh generates sẽ không có tham số gọi lại trong danh sách tham số. Kiểu trả về của nó sẽ là Return<void>.

Chức năng một chiều

Các hàm được đánh dấu bằng từ khóa oneway là các hàm không đồng bộ (máy khách sẽ không chặn quá trình thực thi của chúng) và không có giá trị trả về. Chữ ký C++ của hàm oneway sẽ không có tham số gọi lại trong danh sách tham số và giá trị trả về C++ của nó sẽ là Return<void> .