oneway
के तौर पर मार्क किए गए तरीके ब्लॉक नहीं करते. उन तरीकों के लिए जिन्हें इस तौर पर मार्क नहीं किया गया है
oneway
, क्लाइंट के तरीके को तब तक ब्लॉक किया जाता है, जब तक सर्वर
पूरा किया हुआ हो या जिसे सिंक्रोनस कॉलबैक कहा जाता है (जो भी पहले हो).
सर्वर तरीका लागू करने की सुविधा ज़्यादा से ज़्यादा एक सिंक्रोनस कॉलबैक को कॉल कर सकती है; अतिरिक्त
कॉलबैक कॉल खारिज कर दिए जाते हैं और उन्हें गड़बड़ियों के तौर पर लॉग किया जाता है. अगर किसी तरीके का
कॉलबैक के ज़रिए वैल्यू दिखाता है और इसके कॉलबैक को कॉल नहीं करता. इसे इस तरह लॉग किया जाता है:
और क्लाइंट को ट्रांसपोर्ट गड़बड़ी के रूप में रिपोर्ट किया गया.
पासथ्रू मोड में थ्रेड
पासथ्रू मोड में, ज़्यादातर कॉल सिंक्रोनस होते हैं. हालांकि,
ऐसा व्यवहार जिससे oneway
कॉल क्लाइंट को ब्लॉक न करते हों,
हर प्रोसेस के लिए थ्रेड बनाया जाता है. जानकारी के लिए, यह देखें
HIDL खास जानकारी.
बाइंड किए गए एचएएल में थ्रेड
इनकमिंग RPC कॉल (जिसमें HAL से लेकर एसिंक्रोनस कॉलबैक शामिल हैं) HAL के उपयोगकर्ता) और उनकी मौत के बारे में सूचनाएं, हर प्रोसेस के साथ एक थ्रेडपूल जोड़ा जाता है जो HIDL का इस्तेमाल करता है. अगर एक ही प्रोसेस में कई HIDL इंटरफ़ेस लागू किए जाते हैं और/या मौत की सूचना हैंडलर, इसका थ्रेडपूल इन सभी के बीच शेयर किया जाता है. टास्क कब शुरू होगा किसी प्रोसेस को क्लाइंट से इनकमिंग तरीके से कॉल आता है, तो वह बिना किसी शुल्क के थ्रेड चुनती है Threadपूल से अलग करता है और उस थ्रेड पर कॉल को एक्ज़ीक्यूट करता है. अगर कोई फ़्री थ्रेड नहीं है उपलब्ध है, तो यह तब तक ब्लॉक हो जाता है, जब तक कोई एक उपलब्ध नहीं होता.
अगर सर्वर में सिर्फ़ एक थ्रेड है, तो सर्वर में किए गए कॉल पूरे हो जाते हैं
क्रम में हैं. एक से ज़्यादा थ्रेड वाला सर्वर, सही क्रम में कॉल पूरा नहीं कर सकता
भले ही क्लाइंट में सिर्फ़ एक थ्रेड हो. हालांकि, किसी दिए गए इंटरफ़ेस ऑब्जेक्ट के लिए,
oneway
कॉल ऑर्डर किए जाने की गारंटी है (देखें
सर्वर थ्रेडिंग मॉडल). एक से ज़्यादा थ्रेड वाले सर्वर के लिए जो
कई इंटरफ़ेस होस्ट करता है, oneway
अलग-अलग इंटरफ़ेस पर कॉल करता है
एक-दूसरे पर या ब्लॉक करने वाले अन्य कॉल के साथ प्रोसेस किए जा सकते हैं.
एक ही hwbinder थ्रेड पर नेस्ट किए गए एक से ज़्यादा कॉल भेजे जाते हैं. उदाहरण के लिए, अगर कोई प्रोसेस (A) किसी hwbinder थ्रेड से प्रोसेस (B) में सिंक्रोनस कॉल करती है, और फिर प्रोसेस करता है (B) एक सिंक्रोनस कॉल को प्रोसेस में वापस भेजता है (A), तो कॉल (A) में मूल hwbinder थ्रेड पर चलाया गया, जो मूल कॉल. इस ऑप्टिमाइज़ेशन की मदद से, एक थ्रेड वाला सर्वर नेस्ट किए गए कॉल हैंडल कर सकते हैं, लेकिन यह उन मामलों में लागू नहीं होता जहां कॉल यात्रा करते हैं का एक और क्रम बनाया जा सकता है. उदाहरण के लिए, अगर प्रोसेस (B) ने बाइंडर/वंडबाइंडर कॉल, जिसे प्रोसेस (C) में कॉल किया गया और फिर (C) कॉल को प्रोसेस किया गया (A) में वापस भेजा जाता है, तो इसे (A) में मूल थ्रेड पर नहीं दिखाया जा सकता.
सर्वर थ्रेडिंग मॉडल
पासथ्रू मोड को छोड़कर, HIDL इंटरफ़ेस के सर्वर कार्यान्वयन लाइव जो क्लाइंट के बजाय किसी अन्य प्रोसेस में हो और उसके लिए एक या उससे ज़्यादा थ्रेड का इंतज़ार करना हो इनकमिंग कॉल के तरीके. ये थ्रेड सर्वर के थ्रेडपूल हैं; सर्वर यह काम कर सकता है यह तय किया जा सकता है कि उसे अपने थ्रेडपूल में कितने थ्रेड चलाने हैं. साथ ही, एक का थ्रेडपूल साइज़, ताकि उसके इंटरफ़ेस पर सभी कॉल को क्रम से लगाया जा सके. अगर सर्वर थ्रेडपूल में एक से ज़्यादा थ्रेड हैं, इसलिए यह एक साथ इवेंट पा सकता है पर कॉल किया जा सकता है (C++ में, इसका मतलब है कि शेयर किया गया डेटा लॉक किया गया है).
एक ही इंटरफ़ेस में किए जाने वाले वन-वे कॉल, सीरीज़ के तौर पर दिखते हैं. अगर मल्टी-थ्रेड
इंटरफ़ेस पर क्लाइंट, method1
और method2
को कॉल करता है
IFoo
, और method3
को इंटरफ़ेस IBar
,
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 is called, // and the client resumes execution. ... return Void(); // is basically a no-op };
क्लाइंट थ्रेडिंग मॉडल
क्लाइंट के लिए, ब्लॉक न होने वाले कॉल के थ्रेडिंग मॉडल में अंतर होता है
(वे फ़ंक्शन जिन पर oneway
कीवर्ड का निशान लगाया गया है) और ब्लॉक करना
कॉल (ऐसे फ़ंक्शन जिनमें oneway
कीवर्ड नहीं बताया गया है).
कॉल ब्लॉक करना
कॉल ब्लॉक करने के लिए, क्लाइंट इनमें से कोई एक कार्रवाई होने तक ब्लॉक करता है:
- ट्रांसपोर्ट में गड़बड़ी हुई;
Return
ऑब्जेक्ट में कोई गड़बड़ी हैReturn::isOk()
के साथ वापस पाया जा सकता है. - अगर सर्वर में कोई कॉलबैक है, तो उसे लागू करने के लिए सर्वर को कॉल किया जाता है.
- अगर कोई कॉलबैक पैरामीटर न हो, तो सर्वर लागू करने से वैल्यू मिलती है.
कामयाब होने पर, क्लाइंट एक तर्क के तौर पर जो कॉलबैक फ़ंक्शन पास करता है वह होता है
फ़ंक्शन के वापस आने से पहले, हमेशा सर्वर कॉल करता है. कॉलबैक है
उसी थ्रेड पर एक्ज़ीक्यूट किया जाता है जिस पर फ़ंक्शन कॉल किया गया है, इसलिए लागू करने वाले
फ़ंक्शन कॉल के दौरान लॉक होल्ड करने के दौरान सावधानी बरतनी चाहिए (और उनसे बचना चाहिए
जब भी संभव हो). बिना generates
स्टेटमेंट वाला फ़ंक्शन
या कोई oneway
कीवर्ड अब भी ब्लॉक कर रहा है; तब तक क्लाइंट ब्लॉक होता है, जब तक
सर्वर Return<void>
ऑब्जेक्ट दिखाता है.
एकतरफ़ा कॉल
जब किसी फ़ंक्शन को oneway
के तौर पर मार्क किया जाता है, तो क्लाइंट तुरंत वापस लौट आता है
और सर्वर अपने फ़ंक्शन कॉल को शुरू करने की प्रोसेस के पूरा होने का इंतज़ार नहीं करता. इस
(और कुल मिलाकर), इसका मतलब यह है कि फ़ंक्शन कॉल
समय क्योंकि यह आधा कोड निष्पादित करता है, लेकिन वह लागू करते समय
परफ़ॉर्मेंस के लिए संवेदनशील होती हैं, तो शेड्यूल करने पर कुछ असर पड़ सकता है. आम तौर पर,
एकतरफ़ा कॉल करने से कॉल करने वाले व्यक्ति का कॉल शेड्यूल बना रहता है, जबकि
सामान्य सिंक्रोनस कॉल का इस्तेमाल करने से, शेड्यूलर तुरंत ट्रांसफ़र हो जाता है
कॉलर से लेकर कॉली प्रोसेस तक. यह इसमें परफ़ॉर्मेंस ऑप्टिमाइज़ेशन है
बाइंडर. उन सेवाओं के लिए जहां टारगेट प्रोसेस के दौरान एकतरफ़ा कॉल किया जाना ज़रूरी है
को प्राथमिकता देनी होती है, तो सर्टिफ़िकेट पाने वाली सेवा की शेड्यूलिंग नीति
बदल दिया गया है. C++ में, libhidltransport
की विधि का इस्तेमाल करके
शेड्यूलर की प्राथमिकताओं और नीतियों वाला setMinSchedulerPolicy
sched.h
में बताया गया है कि यह पक्का करता है कि सेवा में की गई सभी कॉल
शेड्यूल करने की नीति और प्राथमिकता तय कर सकते हैं.