oneway
হিসাবে চিহ্নিত পদ্ধতিগুলি ব্লক করে না। oneway
হিসাবে চিহ্নিত নয় এমন পদ্ধতিগুলির জন্য, সার্ভারটি কার্যকর না হওয়া পর্যন্ত ক্লায়েন্টের পদ্ধতি কল ব্লক করে বা একটি সিঙ্ক্রোনাস কলব্যাক (যেটি প্রথমে আসে) বলা হয়। সার্ভার পদ্ধতি বাস্তবায়ন সর্বাধিক একটি সিঙ্ক্রোনাস কলব্যাক কল করতে পারে; অতিরিক্ত কলব্যাক কল বাতিল করা হয় এবং ত্রুটি হিসাবে লগ করা হয়। যদি একটি পদ্ধতি কলব্যাকের মাধ্যমে মান ফেরত দেওয়ার কথা বলে এবং এটির কলব্যাককে কল না করে, তবে এটি একটি ত্রুটি হিসাবে লগ করা হয় এবং ক্লায়েন্টকে একটি পরিবহন ত্রুটি হিসাবে রিপোর্ট করা হয়।
পাসথ্রু মোডে থ্রেড
পাসথ্রু মোডে, বেশিরভাগ কল সিঙ্ক্রোনাস হয়। যাইহোক, oneway
কল ক্লায়েন্টকে অবরুদ্ধ না করে এমন অভিপ্রেত আচরণ সংরক্ষণ করতে, প্রতিটি প্রক্রিয়ার জন্য একটি থ্রেড তৈরি করা হয়। বিস্তারিত জানার জন্য, HIDL ওভারভিউ দেখুন।
বাইন্ডারাইজড HAL-এ থ্রেড
ইনকামিং RPC কলগুলি (HALs থেকে HAL ব্যবহারকারীদের অ্যাসিঙ্ক্রোনাস কলব্যাক সহ) এবং মৃত্যুর বিজ্ঞপ্তিগুলি পরিবেশন করতে, HIDL ব্যবহার করে এমন প্রতিটি প্রক্রিয়ার সাথে একটি থ্রেডপুল যুক্ত থাকে। যদি একটি একক প্রক্রিয়া একাধিক HIDL ইন্টারফেস এবং/অথবা ডেথ নোটিফিকেশন হ্যান্ডলার প্রয়োগ করে, তবে এর থ্রেডপুল তাদের সকলের মধ্যে ভাগ করা হয়। যখন একটি প্রক্রিয়া একটি ক্লায়েন্ট থেকে একটি ইনকামিং পদ্ধতি কল গ্রহণ করে, এটি থ্রেডপুল থেকে একটি বিনামূল্যে থ্রেড বাছাই করে এবং সেই থ্রেডে কলটি চালায়। যদি কোন মুক্ত থ্রেড উপলব্ধ না হয়, এটি একটি উপলব্ধ না হওয়া পর্যন্ত ব্লক করে।
যদি সার্ভারে শুধুমাত্র একটি থ্রেড থাকে, তাহলে সার্ভারে কলগুলি ক্রমানুসারে সম্পন্ন হয়। একাধিক থ্রেড সহ একটি সার্ভার ক্লায়েন্টের শুধুমাত্র একটি থ্রেড থাকলেও অর্ডারের বাইরে কল সম্পূর্ণ করতে পারে। যাইহোক, একটি প্রদত্ত ইন্টারফেস অবজেক্টের জন্য, oneway
কলগুলি অর্ডার করার গ্যারান্টি দেওয়া হয় ( সার্ভার থ্রেডিং মডেল দেখুন)। একটি মাল্টি-থ্রেডেড সার্ভারের জন্য যা একাধিক ইন্টারফেস হোস্ট করে, বিভিন্ন ইন্টারফেসে oneway
কলগুলি একে অপরের সাথে বা অন্য ব্লকিং কলগুলির সাথে একযোগে প্রক্রিয়া করা হতে পারে।
একাধিক নেস্টেড কল একই hwbinder থ্রেডে পাঠানো হয়। উদাহরণস্বরূপ, যদি একটি প্রসেস (A) একটি hwbinder থ্রেড থেকে একটি সিঙ্ক্রোনাস কল করে প্রসেসে (B), এবং তারপর প্রসেস (B) একটি সিঙ্ক্রোনাস কল আবার প্রসেসে (A) করে, কলটি মূল hwbinder থ্রেডে কার্যকর করা হয় (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
ব্যবহার করা নিশ্চিত করে যে পরিষেবাতে সমস্ত কল অন্তত নির্ধারিত সময়সূচী নীতি এবং অগ্রাধিকারে চলে।