फ़ंक्शन

HIDL इंटरफ़ेस में फ़ंक्शंस को स्वचालित रूप से जेनरेट किए गए IFoo C++ वर्ग घोषणा में विधियों से मैप किया जाता है। C++ में प्रत्येक फ़ंक्शन का नाम समान रहता है; निम्नलिखित अनुभाग वर्णन करते हैं कि HIDL तर्क और रिटर्न मान को C++ में कैसे अनुवादित किया जाता है।

फ़ंक्शन पैरामीटर

.hal फ़ाइल में सूचीबद्ध तर्क C++ डेटा प्रकारों पर मैप होते हैं। जो तर्क आदिम C++ प्रकार पर मैप नहीं होते हैं उन्हें कॉन्स्ट संदर्भ द्वारा पारित किया जाता है।

प्रत्येक HIDL फ़ंक्शन के लिए जिसका रिटर्न मान होता है (एक generates स्टेटमेंट होता है), उस फ़ंक्शन के लिए C++ पैरामीटर सूची में एक अतिरिक्त तर्क होता है: एक कॉलबैक फ़ंक्शन जिसे HIDL फ़ंक्शन के रिटर्न मान के साथ कॉल किया जाता है। एक अपवाद है: यदि generates क्लॉज में एक एकल पैरामीटर होता है जो सीधे C++ प्रिमिटिव पर मैप करता है, तो कॉलबैक एलिज़न का उपयोग किया जाता है (कॉलबैक हटा दिया जाता है और रिटर्न वैल्यू सामान्य return स्टेटमेंट के माध्यम से फ़ंक्शन से वापस कर दिया जाता है)।

फ़ंक्शन वापसी मान

निम्नलिखित फ़ंक्शंस में रिटर्न मान हैं।

परिवहन त्रुटियाँ और वापसी प्रकार

generates स्टेटमेंट के परिणामस्वरूप तीन प्रकार के फ़ंक्शन हस्ताक्षर हो सकते हैं:

  • केवल एक रिटर्न मान के लिए जो C++ प्रिमिटिव है, generates रिटर्न मान Return<T> ऑब्जेक्ट में फ़ंक्शन से मान द्वारा लौटाया जाता है।
  • अधिक जटिल मामलों के लिए, generates रिटर्न वैल्यू को फ़ंक्शन कॉल के साथ प्रदान किए गए कॉलबैक पैरामीटर के माध्यम से लौटाया जाता है, और फ़ंक्शन Return<void> लौटाता है।
  • जब कोई generates स्टेटमेंट मौजूद नहीं होता है, तो फ़ंक्शन Return<void> लौटाता है।

आरपीसी कॉल कभी-कभी ट्रांसपोर्ट त्रुटियों का सामना कर सकती हैं, उदाहरण के लिए जब सर्वर बंद हो जाता है, जब ट्रांसपोर्ट संसाधन कॉल को पूरा करने के लिए अपर्याप्त होते हैं, या जब पारित पैरामीटर कॉल को पूरा करने की अनुमति नहीं देते हैं (जैसे कि एक आवश्यक कॉलबैक फ़ंक्शन गायब हो जाता है)। Return ऑब्जेक्ट परिवहन त्रुटि संकेतों के साथ-साथ एक T मान ( Return<void> को छोड़कर) संग्रहीत करते हैं।

चूंकि क्लाइंट-साइड और सर्वर-साइड फ़ंक्शंस में समान हस्ताक्षर होते हैं, सर्वर-साइड फ़ंक्शन को Return प्रकार वापस करना होगा, भले ही इसका कार्यान्वयन ट्रांसपोर्ट त्रुटियों का संकेत न दे। Return<T> ऑब्जेक्ट का निर्माण Return(myTValue) के साथ किया जाता है (या अंतर्निहित रूप से mTValue से बनाया जा सकता है, जैसे कि return स्टेटमेंट में) और Return<void> ऑब्जेक्ट का निर्माण Void() के साथ किया जाता है।

Return<T> ऑब्जेक्ट का उनके T मान से और उसमें अंतर्निहित रूपांतरण होता है। Return ऑब्जेक्ट को इसकी isOk() विधि को कॉल करके ट्रांसपोर्ट त्रुटियों के लिए जांचा जा सकता है। इस जाँच की आवश्यकता नहीं है; हालाँकि, यदि कोई त्रुटि होती है और Return ऑब्जेक्ट के नष्ट होने तक जाँच नहीं की जाती है, या T मान रूपांतरण का प्रयास किया जाता है, तो क्लाइंट प्रक्रिया समाप्त हो जाएगी और एक त्रुटि लॉग हो जाएगी। यदि isOk() डेवलपर कोड में तर्क त्रुटि के कारण ट्रांसपोर्ट त्रुटि या कॉल विफलता को इंगित करता है (जैसे कि सिंक्रोनस कॉलबैक के रूप में nullptr पास करना), तो लॉगिंग के लिए उपयुक्त स्ट्रिंग को वापस करने के लिए description() रिटर्न ऑब्जेक्ट पर कॉल किया जा सकता है। ऐसे मामलों में, यह निर्धारित करने का कोई तरीका नहीं है कि विफल कॉल के परिणामस्वरूप सर्वर पर कितना कोड निष्पादित हुआ होगा। विधि isDeadObject() भी प्रदान की गई है। यह विधि इंगित करती है कि !isOk() इसलिए है क्योंकि दूरस्थ ऑब्जेक्ट क्रैश हो गया है या अब मौजूद नहीं है। isDeadObject() तात्पर्य हमेशा !isOk() होता है।

मूल्य के आधार पर वापसी

यदि generates स्टेटमेंट एकल C++ प्रिमिटिव पर मैप होता है, तो पैरामीटर सूची में कोई कॉलबैक पैरामीटर नहीं है। इसके बजाय, एक कार्यान्वयन Return<T> ऑब्जेक्ट में रिटर्न मान T प्रदान करता है, जिसे मूल प्रकार T से अंतर्निहित रूप से उत्पन्न किया जा सकता है। उदाहरण के लिए:

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

Return<*>::withDefault विधि भी प्रदान की गई है। यह विधि उन मामलों में एक मान प्रदान करती है जहां रिटर्न मान !isOk() है। यह विधि स्वचालित रूप से रिटर्न ऑब्जेक्ट को ठीक के रूप में चिह्नित करती है ताकि क्लाइंट प्रक्रिया समाप्त न हो।

कॉलबैक पैरामीटर का उपयोग करके लौटें

कॉलबैक एचआईडीएल फ़ंक्शन के रिटर्न वैल्यू को कॉलर को वापस भेज सकता है। कॉलबैक का प्रोटोटाइप एक std::function ऑब्जेक्ट है जिसमें पैरामीटर ( generates स्टेटमेंट से लिया गया) C++ प्रकार में मैप किया गया है। इसका रिटर्न मान शून्य है - कॉलबैक स्वयं कोई मान नहीं लौटाता है।

कॉलबैक पैरामीटर वाले C++ फ़ंक्शन के रिटर्न मान का प्रकार Return<void> है। सर्वर कार्यान्वयन केवल रिटर्न मान प्रदान करने के लिए जिम्मेदार है। चूंकि कॉलबैक का उपयोग करके रिटर्न मान पहले ही स्थानांतरित कर दिए गए हैं, 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();
};

वापसी मानों के बिना कार्य

generates स्टेटमेंट के बिना किसी फ़ंक्शन के C++ हस्ताक्षर में पैरामीटर सूची में कॉलबैक पैरामीटर नहीं होगा। इसका रिटर्न प्रकार Return<void>.

वनवे कार्य

oneway कीवर्ड के साथ चिह्नित फ़ंक्शन अतुल्यकालिक फ़ंक्शन हैं (क्लाइंट उनके निष्पादन पर रोक नहीं लगाएंगे) और उनमें रिटर्न मान नहीं होते हैं। oneway फ़ंक्शन के C++ हस्ताक्षर में पैरामीटर सूची में कॉलबैक पैरामीटर नहीं होगा, और इसका C++ रिटर्न मान Return<void> होगा।