oneway হিসেবে চিহ্নিত করা পদ্ধতি ব্লক করে না। oneway হিসেবে চিহ্নিত করা হয়নি এমন পদ্ধতির জন্য, কোনও ক্লায়েন্টের পদ্ধতি কল ব্লক করে যতক্ষণ না সার্ভার
এক্সিকিউশন সম্পূর্ণ করে বা সিঙ্ক্রোনাস কলব্যাক কল করে (যেটি আগে ঘটবে)।
সার্ভার মেথড ইমপ্লিমেন্টেশন সর্বাধিক একটি সিঙ্ক্রোনাস কলব্যাক কল করতে পারে; অতিরিক্ত
কলব্যাক কল বাতিল করা হয় এবং সমস্যা হিসেবে লগ করা হয়। কোনও মেথড যদি কলব্যাকের মাধ্যমে ভ্যালু রিটার্ন করে এবং কলব্যাক কল না করে, তাহলে এটি
এরর হিসেবে লগ করা হয় এবং ক্লায়েন্টকে ট্রান্সপোর্ট এরর হিসেবে রিপোর্ট করা হয়।
পাসথ্রু মোডে থ্রেড
পাসথ্রু মোডে, বেশিরভাগ কল সিঙ্ক্রোনাস হয়। তবে, oneway কল যাতে ক্লায়েন্টকে ব্লক না করে সেই
উদ্দেশ্য বজায় রাখতে, প্রতিটি প্রসেসের জন্য
একটি থ্রেড তৈরি করা হয়। আরও বিবরণের জন্য, HIDL ওভারভিউ দেখুন।
বাইন্ডারাইজড HAL-এ থ্রেড
ইনকামিং RPC কল (HAL থেকে HAL ব্যবহারকারীদের অ্যাসিঙ্ক্রোনাস কলব্যাক সহ) এবং ডেথ বিজ্ঞপ্তি পরিষেবা দিতে, HIDL ব্যবহার করে এমন প্রতিটি প্রসেসের সাথে একটি থ্রেডপুল যুক্ত থাকে। যদি একটি প্রসেস একাধিক HIDL ইন্টারফেস এবং/অথবা ডেথ নোটিফিকেশন হ্যান্ডলার প্রয়োগ করে, তবে এর থ্রেডপুল তাদের সকলের মধ্যে শেয়ার করা হয়। কোনও প্রসেস ক্লায়েন্টের থেকে ইনকামিং মেথড কল পেলে, সেটি থ্রেডপুল থেকে একটি ফ্রি থ্রেড বেছে নেয় এবং সেই থ্রেডে কলটি এক্সিকিউট করে। কোনও ফ্রি থ্রেড উপলভ্য না থাকলে, একটি উপলভ্য না হওয়া পর্যন্ত এটি ব্লক করে।
সার্ভারে যদি একটিই থ্রেড থাকে, তাহলে সার্ভারে আসা কলগুলি
ক্রম অনুযায়ী সম্পূর্ণ করা হয়। ক্লায়েন্টের একটি থ্রেড থাকলেও, একাধিক থ্রেড সহ কোনও সার্ভার কলগুলি ভুল ক্রমে সম্পূর্ণ করতে পারে
। তবে, প্রদত্ত ইন্টারফেস অবজেক্টের জন্য,
oneway কলগুলি অর্ডার করা নিশ্চিত (দেখুন
সার্ভার থ্রেডিং মডেল)। একাধিক ইন্টারফেস হোস্ট করে এমন
মাল্টি-থ্রেডেড সার্ভারের ক্ষেত্রে, oneway বিভিন্ন ইন্টারফেসে কল
একসাথে বা অন্যান্য ব্লকিং কলের সাথে প্রসেস করা হতে পারে।
একই hwbinder থ্রেডে একাধিক নেস্ট করা কল পাঠানো হয়। যেমন, কোনও প্রসেস (A) যদি hwbinder থ্রেড থেকে প্রসেস (B)-তে সিঙ্ক্রোনাস কল করে, এবং তারপর প্রসেস (B) যদি প্রসেস (A)-তে সিঙ্ক্রোনাস কল ব্যাক করে, তাহলে কলটি (A)-এর মূল hwbinder থ্রেডে এক্সিকিউট করা হয় যেটি মূল কলে ব্লক করা থাকে। এই অপ্টিমাইজেশনের ফলে, একটি সিঙ্গেল থ্রেডেড সার্ভার নেস্টেড কল ম্যানেজ করতে পারে। তবে, এটি এমন ক্ষেত্রে প্রযোজ্য নয় যেখানে কলগুলি IPC কলের অন্য সিকোয়েন্সের মাধ্যমে ট্রাভেল করে। যেমন, প্রসেস (B) যদি কোনও বাইন্ডার/ভেন্ডবাইন্ডার কল করে থাকে যা প্রসেস (C)-তে কল করেছে এবং তারপর প্রসেস (C) যদি প্রসেস (A)-তে কল ব্যাক করে, তাহলে (A)-এর মূল থ্রেডে এটি পরিবেশন করা যাবে না।
সার্ভার থ্রেডিং মডেল
পাসথ্রু মোড ছাড়া, ক্লায়েন্টের থেকে আলাদা প্রসেসে HIDL ইন্টারফেসের সার্ভার ইমপ্লিমেন্টেশন লাইভ থাকে এবং ইনকামিং মেথড কলের জন্য অপেক্ষা করার জন্য এক বা একাধিক থ্রেডের প্রয়োজন হয়। এই থ্রেডগুলি হল সার্ভারের থ্রেডপুল; সার্ভার তার থ্রেডপুলে কতগুলি থ্রেড চালাতে চায় তা সিদ্ধান্ত নিতে পারে এবং তার ইন্টারফেসে সমস্ত কল সিরিয়ালাইজ করার জন্য একটি থ্রেডপুল সাইজ ব্যবহার করতে পারে। থ্রেডপুলে সার্ভারের একাধিক থ্রেড থাকলে, এটি যেকোনও ইন্টারফেসে একই সাথে ইনকামিং কল রিসিভ করতে পারে (C++-এ, এর অর্থ হল শেয়ার করা ডেটা অবশ্যই সাবধানে লক করতে হবে)।
একই ইন্টারফেসে একমুখী কলগুলি সিরিয়ালাইজ করা হয়। কোনও মাল্টি-থ্রেডেড
ক্লায়েন্ট ইন্টারফেস
IFoo-এ method1 ও method2 এবং ইন্টারফেস IBar-এ method3 কল করলে, method1 ও method2 সবসময় সিরিয়ালাইজ করা হয়, কিন্তু
method3, method1 ও
method2-এর সাথে প্যারালালভাবে রান করতে পারে।
একক ক্লায়েন্ট থ্রেড এক্সিকিউশন, দুটি উপায়ে একাধিক থ্রেড সহ সার্ভারে কনকারেন্ট এক্সিকিউশনের কারণ হতে পারে:
onewayকল ব্লক হয় না।onewayকল এক্সিকিউট করার পরেonewayনয় এমন কল করা হলে, সার্ভারonewayকল ওonewayনয় এমন কল একসাথে এক্সিকিউট করতে পারে।- সার্ভার পদ্ধতি যা সিঙ্ক্রোনাস কলব্যাকের মাধ্যমে ডেটা ফেরত পাঠায়, তা সার্ভার থেকে কলব্যাক কল করার সাথে সাথেই ক্লায়েন্টকে আনব্লক করতে পারে।
দ্বিতীয় পদ্ধতির ক্ষেত্রে, কলব্যাক কল করার পরে সার্ভার ফাংশনে এক্সিকিউট করা যেকোনও কোড একই সাথে এক্সিকিউট করা যেতে পারে, এর সাথে সার্ভার ক্লায়েন্টের থেকে পাওয়া পরবর্তী কলও হ্যান্ডেল করে। এর মধ্যে সার্ভার ফাংশনে কোড এবং অটোমেটিক ডিস্ট্রাক্টর অন্তর্ভুক্ত যা ফাংশনের শেষে এক্সিকিউট হয়। সার্ভারের থ্রেডপুলে একটির বেশি থ্রেড থাকলে, কল শুধুমাত্র একটি ক্লায়েন্ট থ্রেড থেকে আসলেও কনকারেন্সি সংক্রান্ত সমস্যা দেখা দেয়। (কোনও প্রসেস দ্বারা পরিবেশিত কোনও HAL-এর একাধিক থ্রেডের প্রয়োজন হলে, সব HAL-এর একাধিক থ্রেড থাকে কারণ থ্রেডপুল প্রতি প্রসেস শেয়ার করা হয়।)
সার্ভার প্রদত্ত কলব্যাক কল করার সাথে সাথেই, ট্রান্সপোর্ট ক্লায়েন্টে প্রয়োগ করা কলব্যাক কল করতে পারে এবং ক্লায়েন্টকে আনব্লক করতে পারে। সার্ভার ইমপ্লিমেন্টেশন কলব্যাক কল করার পরে (যার মধ্যে ডেস্ট্রাক্টর রান করাও অন্তর্ভুক্ত থাকতে পারে) যা করে তার সাথে সমান্তরালভাবে ক্লায়েন্ট এগিয়ে চলে। কলব্যাক ক্লায়েন্টকে আর ব্লক না করার পরে সার্ভার ফাংশনে কোড (যতক্ষণ পর্যন্ত সার্ভার থ্রেডপুলে ইনকামিং কল ম্যানেজ করার জন্য পর্যাপ্ত থ্রেড থাকে), তবে ক্লায়েন্ট থেকে ভবিষ্যতের কলের সাথে একইসাথে এক্সিকিউট করা হতে পারে (যদি না সার্ভার থ্রেডপুলে শুধুমাত্র একটি থ্রেড থাকে)।
সিঙ্ক্রোনাস কলব্যাক ছাড়াও, একটি সিঙ্গেল-থ্রেডেড ক্লায়েন্ট থেকে 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++-এ, শিডিউলার অগ্রাধিকার ও নীতি
sched.h-এ সংজ্ঞায়িত করা libhidltransport-এর পদ্ধতি
setMinSchedulerPolicy ব্যবহার করলে, এটি নিশ্চিত করে যে পরিষেবায় করা সব কল
অন্তত সেট করা শিডিউলিং নীতি ও অগ্রাধিকার অনুযায়ী রান করে।