सूत्रण मॉडल

oneway के रूप में चिह्नित विधियाँ अवरुद्ध नहीं होतीं। उन विधियों के लिए जिन्हें oneway के रूप में चिह्नित नहीं किया गया है, क्लाइंट की विधि कॉल तब तक ब्लॉक रहेगी जब तक कि सर्वर निष्पादन पूरा नहीं कर लेता या सिंक्रोनस कॉलबैक नहीं बुला लेता (जो भी पहले हो)। सर्वर विधि कार्यान्वयन अधिकतम एक सिंक्रोनस कॉलबैक पर कॉल कर सकता है; अतिरिक्त कॉलबैक कॉल को खारिज कर दिया जाता है और त्रुटियों के रूप में लॉग किया जाता है। यदि किसी विधि को कॉलबैक के माध्यम से मान लौटाना है और वह अपने कॉलबैक को कॉल नहीं करता है, तो इसे एक त्रुटि के रूप में लॉग किया जाता है और क्लाइंट को ट्रांसपोर्ट त्रुटि के रूप में रिपोर्ट किया जाता है।

पासथ्रू मोड में थ्रेड

पासथ्रू मोड में, अधिकांश कॉल सिंक्रोनस होती हैं। हालाँकि, इच्छित व्यवहार को संरक्षित करने के लिए कि oneway कॉल क्लाइंट को ब्लॉक न करें, प्रत्येक प्रक्रिया के लिए एक थ्रेड बनाया जाता है। विवरण के लिए, HIDL अवलोकन देखें।

बाइंडरयुक्त एचएएल में धागे

आने वाली आरपीसी कॉल (एचएएल से एचएएल उपयोगकर्ताओं के लिए अतुल्यकालिक कॉलबैक सहित) और मृत्यु सूचनाओं की सेवा के लिए, एचआईडीएल का उपयोग करने वाली प्रत्येक प्रक्रिया के साथ एक थ्रेडपूल जुड़ा हुआ है। यदि एक एकल प्रक्रिया एकाधिक एचआईडीएल इंटरफेस और/या मृत्यु अधिसूचना हैंडलर लागू करती है, तो इसका थ्रेडपूल उन सभी के बीच साझा किया जाता है। जब किसी प्रक्रिया को क्लाइंट से इनकमिंग मेथड कॉल प्राप्त होती है, तो वह थ्रेडपूल से एक फ्री थ्रेड चुनती है और उस थ्रेड पर कॉल निष्पादित करती है। यदि कोई निःशुल्क थ्रेड उपलब्ध नहीं है, तो यह तब तक अवरुद्ध रहता है जब तक कोई उपलब्ध न हो जाए।

यदि सर्वर में केवल एक थ्रेड है, तो सर्वर में कॉल क्रम में पूरी हो जाती हैं। एक से अधिक थ्रेड वाला सर्वर ऑर्डर से बाहर कॉल को पूरा कर सकता है, भले ही क्लाइंट के पास केवल एक थ्रेड हो। हालाँकि, किसी दिए गए इंटरफ़ेस ऑब्जेक्ट के लिए, oneway कॉल को ऑर्डर करने की गारंटी दी जाती है ( सर्वर थ्रेडिंग मॉडल देखें)। एक मल्टी-थ्रेडेड सर्वर के लिए जो कई इंटरफेस को होस्ट करता है, विभिन्न इंटरफेस पर oneway कॉल को एक-दूसरे या अन्य ब्लॉकिंग कॉल के साथ समवर्ती रूप से संसाधित किया जा सकता है।

एकाधिक नेस्टेड कॉल एक ही hwbinder थ्रेड पर भेजी जाएंगी। उदाहरण के लिए, यदि कोई प्रक्रिया (ए) ह्वबिंडर थ्रेड से प्रक्रिया (बी) में एक सिंक्रोनस कॉल करती है, और फिर प्रक्रिया (बी) प्रक्रिया (ए) में वापस सिंक्रोनस कॉल करती है, तो कॉल को मूल ह्वबिंडर थ्रेड पर निष्पादित किया जाएगा। (ए) में जो मूल कॉल पर अवरुद्ध है। यह अनुकूलन एकल थ्रेडेड सर्वर को नेस्टेड कॉल को संभालने में सक्षम बनाता है, लेकिन यह उन मामलों तक विस्तारित नहीं होता है जहां कॉल आईपीसी कॉल के किसी अन्य अनुक्रम के माध्यम से यात्रा करते हैं। उदाहरण के लिए, यदि प्रक्रिया (बी) ने एक बाइंडर/वीएनडीबाइंडर कॉल किया था जो प्रक्रिया (सी) में कॉल करता था और फिर प्रक्रिया (सी) वापस (ए) में कॉल करती है, तो इसे (ए) में मूल थ्रेड पर नहीं परोसा जा सकता है।

सर्वर थ्रेडिंग मॉडल

पासथ्रू मोड को छोड़कर, एचआईडीएल इंटरफेस का सर्वर कार्यान्वयन क्लाइंट की तुलना में एक अलग प्रक्रिया में रहता है और आने वाली विधि कॉल की प्रतीक्षा में एक या अधिक थ्रेड की आवश्यकता होती है। ये थ्रेड सर्वर के थ्रेडपूल हैं; सर्वर यह तय कर सकता है कि वह अपने थ्रेडपूल में कितने थ्रेड चलाना चाहता है, और अपने इंटरफेस पर सभी कॉलों को क्रमबद्ध करने के लिए एक थ्रेडपूल आकार का उपयोग कर सकता है। यदि सर्वर के थ्रेडपूल में एक से अधिक थ्रेड हैं, तो यह अपने किसी भी इंटरफेस पर समवर्ती इनकमिंग कॉल प्राप्त कर सकता है (C++ में, इसका मतलब है कि साझा डेटा को सावधानीपूर्वक लॉक किया जाना चाहिए)।

एक ही इंटरफ़ेस में वनवे कॉल क्रमबद्ध हैं। यदि एक मल्टी-थ्रेडेड क्लाइंट इंटरफ़ेस IFoo पर method1 और method2 और इंटरफ़ेस IBar पर method3 कॉल करता है, तो method1 और method2 हमेशा क्रमबद्ध किया जाएगा, लेकिन method3 method1 और method2 के समानांतर चल सकता है।

निष्पादन का एक एकल क्लाइंट थ्रेड एकाधिक थ्रेड वाले सर्वर पर दो तरीकों से समवर्ती निष्पादन का कारण बन सकता है:

  • oneway कॉल ब्लॉक नहीं होतीं. यदि oneway कॉल निष्पादित की जाती है और फिर नॉन- oneway कॉल किया जाता है, तो सर्वर oneway कॉल और नॉन- oneway कॉल एक साथ निष्पादित कर सकता है।
  • सर्वर विधियां जो सिंक्रोनस कॉलबैक के साथ डेटा वापस भेजती हैं, सर्वर से कॉलबैक कॉल होते ही क्लाइंट को अनब्लॉक कर सकती हैं।

दूसरे तरीके के लिए, सर्वर फ़ंक्शन में कोई भी कोड जो कॉलबैक कॉल के बाद निष्पादित होता है, समवर्ती रूप से निष्पादित हो सकता है, साथ ही सर्वर क्लाइंट से बाद की कॉल को संभाल सकता है। इसमें सर्वर फ़ंक्शन में कोड और स्वचालित डिस्ट्रक्टर शामिल हैं जो फ़ंक्शन के अंत में निष्पादित होते हैं। यदि सर्वर के थ्रेडपूल में एक से अधिक थ्रेड हैं, तो समवर्ती समस्याएँ उत्पन्न होती हैं, भले ही कॉल केवल एक ही क्लाइंट थ्रेड से आ रही हों। (यदि किसी प्रक्रिया द्वारा संचालित किसी एचएएल को एकाधिक थ्रेड की आवश्यकता होती है, तो सभी एचएएल में एकाधिक थ्रेड होंगे क्योंकि थ्रेडपूल प्रति-प्रक्रिया साझा किया जाता है।)

जैसे ही सर्वर दिए गए कॉलबैक को कॉल करता है, ट्रांसपोर्ट क्लाइंट पर कार्यान्वित कॉलबैक को कॉल कर सकता है और क्लाइंट को अनब्लॉक कर सकता है। क्लाइंट कॉलबैक कॉल करने के बाद सर्वर कार्यान्वयन जो कुछ भी करता है उसके समानांतर आगे बढ़ता है (जिसमें रनिंग डिस्ट्रक्टर्स शामिल हो सकते हैं)। कॉलबैक के बाद सर्वर फ़ंक्शन में कोड अब क्लाइंट को ब्लॉक नहीं कर रहा है (जब तक सर्वर थ्रेडपूल में इनकमिंग कॉल को संभालने के लिए पर्याप्त थ्रेड हैं), लेकिन क्लाइंट से भविष्य की कॉल के साथ समवर्ती रूप से निष्पादित किया जा सकता है (जब तक कि सर्वर थ्रेडपूल में केवल एक थ्रेड न हो) ).

सिंक्रोनस कॉलबैक के अलावा, एकल-थ्रेडेड क्लाइंट से oneway कॉल को उसके थ्रेडपूल में एकाधिक थ्रेड वाले सर्वर द्वारा समवर्ती रूप से नियंत्रित किया जा सकता है, लेकिन केवल तभी जब उन oneway कॉल को विभिन्न इंटरफेस पर निष्पादित किया जाता है। एक ही इंटरफ़ेस पर oneway कॉल हमेशा क्रमबद्ध होती हैं।

नोट: हम सर्वर फ़ंक्शंस को कॉलबैक फ़ंक्शन कॉल करते ही वापस लौटने के लिए दृढ़ता से प्रोत्साहित करते हैं।

उदाहरण के लिए (C++ में):

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    // At this point, the client's callback will be called,
    // and the client will resume execution.
    ...
    return Void(); // is basically a no-op
};

क्लाइंट थ्रेडिंग मॉडल

क्लाइंट पर थ्रेडिंग मॉडल नॉन-ब्लॉकिंग कॉल (फ़ंक्शन जो oneway कीवर्ड के साथ चिह्नित हैं) और ब्लॉकिंग कॉल (फ़ंक्शन जिनमें oneway कीवर्ड निर्दिष्ट नहीं है) के बीच भिन्न होता है।

कॉल ब्लॉक करना

कॉल को ब्लॉक करने के लिए, क्लाइंट निम्न में से कोई एक होने तक ब्लॉक करता है:

  • परिवहन त्रुटि होती है; Return ऑब्जेक्ट में एक त्रुटि स्थिति होती है जिसे Return::isOk() से पुनर्प्राप्त किया जा सकता है।
  • सर्वर कार्यान्वयन कॉलबैक को कॉल करता है (यदि कोई था)।
  • सर्वर कार्यान्वयन एक मान लौटाता है (यदि कोई कॉलबैक पैरामीटर नहीं था)।

सफलता के मामले में, क्लाइंट जिस कॉलबैक फ़ंक्शन को तर्क के रूप में पास करता है, उसे फ़ंक्शन के वापस आने से पहले हमेशा सर्वर द्वारा कॉल किया जाता है। कॉलबैक उसी थ्रेड पर निष्पादित किया जाता है जिस पर फ़ंक्शन कॉल किया जाता है, इसलिए कार्यान्वयनकर्ताओं को फ़ंक्शन कॉल के दौरान लॉक रखने में सावधानी बरतनी चाहिए (और जब संभव हो तो उनसे पूरी तरह बचें)। generates स्टेटमेंट या oneway कीवर्ड के बिना एक फ़ंक्शन अभी भी अवरुद्ध हो रहा है; क्लाइंट तब तक ब्लॉक करता है जब तक सर्वर Return<void> ऑब्जेक्ट वापस नहीं कर देता।

वनवे कॉल

जब किसी फ़ंक्शन को oneway रूप में चिह्नित किया जाता है, तो क्लाइंट तुरंत वापस आ जाता है और सर्वर द्वारा उसके फ़ंक्शन कॉल आमंत्रण को पूरा करने की प्रतीक्षा नहीं करता है। सतह पर (और कुल मिलाकर), इसका मतलब है कि फ़ंक्शन कॉल में आधा समय लगता है क्योंकि यह आधा कोड निष्पादित कर रहा है, लेकिन जब कार्यान्वयन लिखते हैं जो प्रदर्शन के प्रति संवेदनशील होते हैं, तो इसमें कुछ शेड्यूलिंग निहितार्थ होते हैं। आम तौर पर, वनवे कॉल का उपयोग करने से कॉलर को शेड्यूल करना जारी रहता है जबकि सामान्य सिंक्रोनस कॉल का उपयोग करने से शेड्यूलर तुरंत कॉलर से कैली प्रक्रिया में स्थानांतरित हो जाता है। यह बाइंडर में एक प्रदर्शन अनुकूलन है। उन सेवाओं के लिए जहां वनवे कॉल को उच्च प्राथमिकता के साथ लक्ष्य प्रक्रिया में निष्पादित किया जाना चाहिए, प्राप्त सेवा की शेड्यूलिंग नीति को बदला जा सकता है। C++ में, libhidltransport की विधि setMinSchedulerPolicy sched.h में परिभाषित शेड्यूलर प्राथमिकताओं और नीतियों के साथ उपयोग करने से यह सुनिश्चित होता है कि सेवा में सभी कॉल कम से कम सेट शेड्यूलिंग नीति और प्राथमिकता पर चलती हैं।