פונקציות

פונקציות בממשק HIDL ממופות ל-methods בממשק שנוצר באופן אוטומטי הצהרת IFoo של כיתה ב-C++. השם של כל פונקציה נשאר ללא שינוי אותו הדבר ב-C++ ; בקטעים הבאים מתוארים האופן שבו ארגומנטים של HIDL וחוזרים מתורגמים ל-C++.

פרמטרים של פונקציה

הארגומנטים שמופיעים בקובץ .hal ממופים לסוגי נתונים מסוג C++ (C++. ארגומנטים שלא ממופים לסוג C++ פרימיטיבי מועברים באמצעות קבוע הפניה.

לכל פונקציית HIDL שיש לה ערך מוחזר (עם generates) הצהרה), ברשימת הפרמטרים C++ של הפונקציה הזו יש ארגומנט נוסף: פונקציית קריאה חוזרת שנקראת עם הערכים המוחזרים של פונקציית HIDL. יש חריג אחד: אם התנאי generates מכיל פרמטר יחיד שממופה ישירות אל רכיב C++, קריאה חוזרת נעשה שימוש ב-elision (הקריאה החוזרת תוסר והערך המוחזר הוא שמוחזר מהפונקציה באמצעות הצהרת return רגילה).

ערכים מוחזרים של פונקציה

לפונקציות הבאות יש ערכי החזרה.

שגיאות בהעברה וסוג ההחזרה

ההצהרה generates יכולה להוביל לשלושה סוגי פונקציות חתימות:

  • רק עבור ערך מוחזר אחד שהוא פרימיטיבי של C++ , הערך המוחזר של generates מוחזר לפי ערך מהפונקציה אובייקט Return<T>.
  • במקרים מורכבים יותר, הערכים המוחזרים של generates הם שמוחזר דרך פרמטר הקריאה החוזרת שסופק עם הקריאה לפונקציה עצמה, והפונקציה מחזירה 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 שגיאות תעבורה על ידי קריאה ל-method 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. הזה ה-method מספקת ערך במקרים שבהם הערך המוחזר הוא !isOk(). השיטה הזו גם מסמנת באופן אוטומטי את האובייקט המוחזר בתור 'תקין', כך שהלקוח התהליך לא יושמד.

החזרה באמצעות פרמטר קריאה חוזרת

קריאה חוזרת יכולה להעביר לפונקציית קריאה חוזרת את הערך המוחזר של פונקציית HIDL. אב הטיפוס של הקריאה החוזרת הוא אובייקט std::function עם פרמטרים (שנלקחים מההצהרה generates) שממופים ל-C++ שונים. הערך המוחזר שלו ריק – הקריאה החוזרת עצמה לא מחזירה ערך.

הערך המוחזר של פונקציית C++ עם פרמטר קריאה חוזרת הוא מסוג Return<void> הטמעת השרת אחראית בלבד לציון הערך המוחזר. כי הערכים המוחזרים כבר הועברו באמצעות הקריאה החוזרת (callback), פרמטר התבנית 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>.