Hàm

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

Tham số hàm

Các đối số được liệt kê trong tệp .hal liên kết với các kiểu dữ liệu C++. Các đối số không ánh xạ đến loại C++ gốc được truyền bởi hàm const tham chiếu.

Đối với mỗi hàm HIDL có giá trị trả về (có generates ), danh sách tham số C++ cho hàm đó có thêm đối số: một hàm callback được gọi bằng 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 đến lệnh gọi lại gốc C++ elision được sử dụng (lệnh gọi lại bị xoá và giá trị trả về là đượ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 có giá trị trả về.

Lỗi truyền tải và loại dữ liệu trả về

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

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

Lệnh gọi RPC đôi khi có thể gặp lỗi truyền tải, ví dụ: khi máy chủ bị chết, khi tài nguyên vận chuyển không đủ để hoàn tất cuộc gọi hoặc khi các tham số đã chuyển không cho phép hoàn tất lệnh gọi (chẳng hạn như thiếu hàm callback bắt buộc). Lỗi truyền tải Return đối tượng lưu trữ chỉ báo 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ề loại Return mặc dù không báo hiệu lỗi truyền tải. Return<T> các đối tượng được tạo bằng Return(myTValue) (hoặc có thể được ngầm hiểu là được tạo từ mTValue, chẳng hạn như trong return ) và đối tượng Return<void> được tạo bằng Void().

Các đối tượng Return<T> có lượt chuyển đổi ngầm ẩn đến và đi giá trị T của chúng. Bạn có thể kiểm tra đối tượng Return để tìm truyền lỗi bằng cách gọi phương thức isOk(). Bước kiểm tra này 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ị huỷ hoặc một lượt chuyển đổi giá trị T thì quá trình ứng dụng khách sẽ bị dừng và một lỗi được ghi lại. Nếu isOk() cho biết lỗi truyền tải hoặc lỗi lệnh gọi do logic lỗi trong mã nhà phát triển (chẳng hạn như truyền nullptr dưới dạng một mã đồng bộ callback), thì description() có thể được gọi trên đối tượng Trả về để trả về một chuỗi phù hợp để 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ể đã thực thi trên máy chủ do cuộc gọi không thành công. Phương thức isDeadObject() cũng được cung cấp. Chiến dịch này phương thức này cho biết !isOk() là do đối tượng từ xa đã đã gặp sự cố 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 gốc C++ duy nhất, thì không tham số callback có trong danh sách tham số. Thay vào đó, việc triển khai sẽ cung cấp giá trị trả về T trong đối tượng Return<T>. có thể được tạo ngầm từ kiểu dữ liệu nguyên gốc 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. Chiến dịch này sẽ 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 để ứng dụng sẽ không bị dừng.

Trả lại bằng tham số callback

Lệnh gọi lại có thể truyền giá trị trả về của hàm HIDL ngược lại cho phương thức gọi. Nguyên mẫu của lệnh gọi lại là đối tượng std::function có tham số (lấy từ câu lệnh generates) được ánh xạ tới C++ loại. Giá trị trả về là trống – 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++ có 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ì giá trị trả về đã được chuyển bằng cách sử dụng lệnh gọi lại, tham số mẫu Tvoid:

Return<void> someMethod(someMethod_cb _cb);

Từ quá trình triển khai C++, các hoạt động triển khai máy chủ sẽ trả về Void() là một hàm cùng dòng tĩnh trả về một Đối tượng Return<void>. Ví dụ về phương thức máy chủ điển hình bằng cách sử dụng thông 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 một hàm không có câu lệnh generates sẽ không có thông số gọi lại trong danh sách thông số. Loại dữ liệu trả về sẽ là Return<void>.

Hàm một chiều

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