फ़ंक्शन

HIDL इंटरफ़ेस में मौजूद फ़ंक्शन, अपने-आप जनरेट हुई IFoo C++ क्लास के एलान में मौजूद तरीकों से मैप किए जाते हैं. C++ में हर फ़ंक्शन का नाम एक जैसा ही रहता है. नीचे दिए गए सेक्शन में बताया गया है कि HIDL आर्ग्युमेंट और रिटर्न वैल्यू को C++ में कैसे बदला जाता है.

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

.hal फ़ाइल में दिए गए आर्ग्युमेंट, C++ डेटा टाइप पर मैप होते हैं. ऐसे आर्ग्युमेंट जिन्हें प्राइमटिव C++ टाइप में मैप नहीं किया जाता है उन्हें const रेफ़रंस के ज़रिए पास किया जाता है.

हर उस 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) से बनाए जाते हैं (या return स्टेटमेंट में mTValue से, इनपुट के तौर पर ऑब्जेक्ट बनाए जा सकते हैं) और Return<void> ऑब्जेक्ट, Void() से बनाए जाते हैं.

Return<T> ऑब्जेक्ट की T वैल्यू में, अपने-आप बदलाव होता है. Return ऑब्जेक्ट के isOk() तरीके को कॉल करके, ट्रांसपोर्ट से जुड़ी गड़बड़ियों की जांच की जा सकती है. इस जांच की ज़रूरत नहीं है. हालांकि, अगर कोई गड़बड़ी होती है और Return ऑब्जेक्ट के नष्ट होने या T वैल्यू कन्वर्ज़न की कोशिश करने तक इसकी जांच नहीं की जाती है, तो क्लाइंट प्रोसेस को बंद कर दिया जाएगा और गड़बड़ी को लॉग कर दिया जाएगा. अगर isOk(), डेवलपर कोड में लॉजिक से जुड़ी गड़बड़ी की वजह से, ट्रांसपोर्ट से जुड़ी गड़बड़ी या कॉल पूरा न होने की जानकारी देता है, तो लॉग करने के लिए सही स्ट्रिंग दिखाने के लिए, रिटर्न ऑब्जेक्ट पर description() को कॉल किया जा सकता है. जैसे, nullptr को सिंक्रोनस कॉलबैक के तौर पर पास करना. ऐसे मामलों में, यह तय करने का कोई तरीका नहीं है कि कॉल पूरा न होने की वजह से, सर्वर पर कितना कोड चलाया गया. 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() होती है. यह तरीका, रिटर्न ऑब्जेक्ट को अपने-आप 'ठीक है' के तौर पर भी मार्क करता है, ताकि क्लाइंट प्रोसेस बंद न हो.

कॉलबैक पैरामीटर का इस्तेमाल करके रिटर्न

कॉलबैक, HIDL फ़ंक्शन की रिटर्न वैल्यू को कॉल करने वाले को वापस भेज सकता है. कॉलबैक का प्रोटोटाइप, C++ टाइप पर मैप किए गए पैरामीटर (generates स्टेटमेंट से लिए गए) वाला std::function ऑब्जेक्ट होता है. इसकी रिटर्न वैल्यू शून्य होती है—कॉलबैक खुद कोई वैल्यू नहीं दिखाता.

कॉलबैक पैरामीटर वाले 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 कीवर्ड से मार्क किए गए फ़ंक्शन, असाइनोक्रोनस फ़ंक्शन होते हैं. इनके लागू होने पर क्लाइंट ब्लॉक नहीं होते. साथ ही, इनमें रिटर्न वैल्यू नहीं होती. oneway फ़ंक्शन के C++ सिग्नेचर में, पैरामीटर सूची में कॉलबैक पैरामीटर नहीं होगा. साथ ही, इसकी C++ रिटर्न वैल्यू Return<void> होगी.