سلاسل محادثات النماذج

لا يتم حظر الطرق التي تم وضع علامة oneway عليها. بالنسبة إلى الطرق التي لم يتم وضع علامة عليها oneway، يتم حظر طلب طريقة العميل إلى أن يكمل الخادم التنفيذ أو يستدعي طلب استدعاء متزامنًا (أيهما يحدث أولاً). يمكن لعمليات تنفيذ طرق الخادم استدعاء طلب استدعاء واحد متزامن كحد أقصى، ويتم تجاهل طلبات استدعاء إضافية وتدوينها كأخطاء. إذا كان من المفترض أن تعرض إحدى الطرق قيمًا من خلال دالة الاستدعاء بدون استدعاء دالة الاستدعاء، يتم تسجيل ذلك على أنّه خطأ ويتم الإبلاغ عنه كخطأ في النقل إلى العميل.

سلاسل المحادثات في وضع "النقل المباشر"

في وضع "النقل المباشر"، تكون معظم المكالمات متزامنة. ومع ذلك، للحفاظ على السلوك المقصود الذي لا يؤدي فيه الاتصال بـ oneway إلى حظر العميل، يتم إنشاء سلسلة محادثات لكل عملية. لمعرفة التفاصيل، يُرجى الاطّلاع على نظرة عامة على HIDL.

سلاسل المحادثات في واجهات HAL المُجمَّعة

لتقديم طلبات RPC الواردة (بما في ذلك عمليات الاستدعاء غير المتزامنة من واجهات HAL إلى مستخدمي HAL) وإشعارات الإيقاف، يتم ربط تجمع مؤشرات تسلسل مع كل عملية تستخدم HIDL. إذا كانت عملية واحدة تنفِّذ واجهات HIDL متعددة و/أو معالجات إشعارات الإيقاف، تتم مشاركة تجمع مؤشرات الترابط بينها جميعًا. عندما تتلقّى عملية مكالمة واردة من عميل، تختار مؤشر تسلسل رسائل مجانيًا من تجمع مؤشرات التسلسل وتنفيذ المكالمة على مؤشر التسلسل هذا. إذا لم يكن هناك سلسلة محادثات مجانية متاحة، يتم حظر الرسائل إلى أن تصبح سلسلة محادثات متاحة.

إذا كان الخادم يتضمّن سلسلة محادثات واحدة فقط، يتم إكمال المكالمات إلى الخادم بالترتيب. قد يُكمل الخادم الذي يتضمّن أكثر من سلسلة محادثات المكالمات بترتيب عشوائي حتى إذا كان العميل يتضمّن سلسلة محادثات واحدة فقط. ومع ذلك، بالنسبة إلى عنصر واجهة معيّن، يتم ضمان ترتيب طلبات oneway (راجِع نموذج تسلسل المهام في الخادم). بالنسبة إلى الخادم المتعدّد المواضيع الذي يستضيف واجهات متعددة، oneway قد تتم معالجة طلبات الاتصال بواجهات مختلفة بالتزامن مع بعضها أو مع طلبات اتصال أخرى محظورة.

يتم إرسال عدة طلبات مُدمجة في سلسلة محادثات hwbinder نفسها. على سبيل المثال، إذا أجرت العملية (أ) مكالمة متزامنة من سلسلة مهام hwbinder إلى العملية (ب)، ثم أجرت العملية (ب) مكالمة متزامنة مرة أخرى إلى العملية (أ)، يتم تنفيذ المكالمة في سلسلة مهام hwbinder الأصلية في العملية (أ) التي يتم حظرها في المكالمة الأصلية. يتيح هذا التحسين إمكانية توفُّر خادم أحادي السلسلة قادر على معالجة المكالمات المُدمجة، ولكنّه لا يشمل الحالات التي تنتقل فيها المكالمات من خلال تسلسل آخر من طلبات IPC. على سبيل المثال، إذا أجرت العملية (ب) طلبًا لشدَّة binder/vndbinder الذي طلب إجراء عملية (ج)، ثم طلبت العملية (ج) العودة إلى العملية (أ)، لا يمكن عرضها في سلسلة التعليمات الأصلية في العملية (أ).

نموذج معالجة المهام في الخادم

باستثناء وضع "النقل المباشر"، يتم تنفيذ واجهات HIDL على الخادم في عملية مختلفة عن عملية العميل وتحتاج إلى سلسلة محادثات واحدة أو أكثر في انتظار طلبات تشغيل الطرق الواردة. هذه المواضيع هي مجموعة المواضيع الخاصة بالخادم، ويمكن للخادم تحديد عدد المواضيع التي يريد تشغيلها في مجموعة المواضيع، ويمكنه استخدام حجم مجموعة مواضيع واحد لتسلسل جميع طلبات البيانات على واجهاته. إذا كان الخادم يتضمّن أكثر من سلسلة مهام واحدة في تجمع سلاسل المهام، يمكنه تلقّي طلبات واردة متزامنة على أي من واجهاته (في C++، يعني ذلك أنّه يجب قفل البيانات المشترَكة بعناية).

يتم تسلسل المكالمات أحادية الاتجاه إلى الواجهة نفسها. إذا كان العميل المتعدّد المواضيع يُطلِب method1 وmethod2 على الواجهة IFoo وmethod3 على الواجهة IBar، تتم تسلسل 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 على دالة، يعود العميل على الفور ولا ينتظر الخادم إكمال طلب استدعاء الدالة. على الصعيد العميق (وبشكل إجمالي)، يعني ذلك أنّ طلب الدالة يستغرق نصف المدّة لأنّه ينفذ نصف الرمز البرمجي، ولكن عند كتابة عمليات التنفيذ التي تعتمد على الأداء، يكون لهذا الإجراء بعض الآثار في الجدول الزمني. في العادة، يؤدي استخدام مكالمة أحادية الاتجاه إلى مواصلة جدولة المتصل، في حين يؤدي استخدام مكالمة عادية متزامنة إلى نقل المخطِّط على الفور من المتصل إلى عملية المُتصل إليه. هذا تحسين للأداء في binder. بالنسبة إلى الخدمات التي يجب تنفيذ المكالمة أحادية الاتجاه فيها في العملية المستهدفة بأولوية عالية، يمكن تغيير سياسة الجدولة للخدمة المستلِمة. في C++، يضمن استخدام libhidltransportsetMinSchedulerPolicy مع أولويات المخطِّط وسياساته المحدَّدة في sched.h أن يتم تنفيذ جميع طلبات البيانات إلى الخدمة على الأقل وفقًا لسياسة الجدولة والأولوية المحدَّدة.