کارکرد

توابع در یک رابط HIDL به روش‌های موجود در اعلان کلاس IFoo C++ که به صورت خودکار تولید می‌شوند، نگاشت می‌شوند. نام هر تابع در C++ ثابت می ماند. بخش‌های زیر نحوه ترجمه آرگومان‌های HIDL و مقادیر بازگشتی به C++ را توضیح می‌دهند.

پارامترهای تابع

آرگومان های فهرست شده در فایل .hal به انواع داده های C++ نگاشت می شوند. آرگومان هایی که به یک نوع C++ اولیه نگاشت نمی شوند با مرجع const منتقل می شوند.

برای هر تابع HIDL که دارای مقدار بازگشتی است (دارای یک دستور generates )، لیست پارامترهای C++ برای آن تابع دارای یک آرگومان اضافی است: یک تابع فراخوانی که با مقادیر بازگشتی تابع HIDL فراخوانی می شود. یک استثنا وجود دارد: اگر بند generates شامل یک پارامتر واحد باشد که مستقیماً به یک 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() است.

بازگشت بر اساس ارزش

اگر دستورات به یک C++ اولیه generates ، هیچ پارامتر برگشتی در لیست پارامترها وجود ندارد. در عوض، یک پیاده سازی مقدار بازگشتی T در یک شی Return<T> ارائه می دهد که می تواند به طور ضمنی از نوع اولیه T تولید شود. مثلا:

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

روش Return<*>::withDefault نیز ارائه شده است. این متد در مواردی که مقدار بازگشتی !isOk() باشد مقداری را ارائه می دهد. این روش همچنین به طور خودکار شی بازگشتی را به عنوان Okay علامت گذاری می کند تا فرآیند مشتری از بین نرود.

با استفاده از پارامتر برگشت به تماس برگردید

یک تماس برگشتی می تواند مقدار برگشتی تابع HIDL را به تماس گیرنده برگرداند. نمونه اولیه callback یک شیء std::function با پارامترهای (برگرفته از دستور generates ) است که به انواع C++ نگاشت شده است. مقدار برگشتی آن باطل است - پاسخ به خود مقداری را بر نمی گرداند.

مقدار بازگشتی یک تابع C++ با پارامتر برگشت تماس دارای نوع Return<void> است. اجرای سرور فقط مسئول ارائه مقدار بازگشتی است. از آنجایی که مقادیر برگشتی قبلاً با استفاده از تماس برگشتی منتقل شده اند، پارامتر الگوی 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 ، پارامتری برای بازگشت به تماس در لیست پارامترها نخواهد داشت. نوع برگشتی آن Return<void>.

توابع یک طرفه

توابع علامت گذاری شده با کلمه کلیدی oneway توابع ناهمزمان هستند (کلاینت ها در اجرای آنها مسدود نمی شوند) و مقادیر برگشتی ندارند. امضای C++ یک تابع oneway در لیست پارامترها پارامتر برگشتی ندارد و مقدار بازگشتی C++ آن Return<void> خواهد بود.