نماذج الخيوط

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

المواضيع في وضع العبور

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

المواضيع في HALs ملزمة

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

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

سيتم إرسال مكالمات متداخلة متعددة على نفس مؤشر ترابط hwbinder. على سبيل المثال، إذا قامت العملية (أ) بإجراء مكالمة متزامنة من مؤشر ترابط hwbinder إلى العملية (ب)، ثم قامت العملية (ب) بإجراء اتصال متزامن مرة أخرى إلى العملية (أ)، فسيتم تنفيذ الاستدعاء على مؤشر ترابط hwbinder الأصلي في (أ) المحظورة في المكالمة الأصلية. يجعل هذا التحسين من الممكن أن يكون لديك خادم مترابط واحد قادر على التعامل مع المكالمات المتداخلة، ولكنه لا يمتد إلى الحالات التي تنتقل فيها المكالمات عبر تسلسل آخر من مكالمات IPC. على سبيل المثال، إذا كانت العملية (B) قد أجرت استدعاء Binder/vndbinder الذي تم استدعاؤه إلى العملية (C) ثم معالجة الاستدعاءات (C) مرة أخرى إلى (A)، فلا يمكن تقديمها على مؤشر الترابط الأصلي في (A).

نموذج خيوط الخادم

باستثناء وضع العبور، تعيش تطبيقات الخادم لواجهات 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 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 ، يعود العميل فورًا ولا ينتظر حتى يكمل الخادم استدعاء الوظيفة. على السطح (وبالإجمال)، يعني هذا أن استدعاء الوظيفة يستغرق نصف الوقت لأنه ينفذ نصف التعليمات البرمجية، ولكن عند كتابة تطبيقات حساسة للأداء، فإن هذا له بعض آثار الجدولة. عادةً، يؤدي استخدام مكالمة أحادية الاتجاه إلى استمرار جدولة المتصل بينما يؤدي استخدام مكالمة متزامنة عادية إلى تحويل المجدول على الفور من المتصل إلى عملية المستدعي. هذا هو تحسين الأداء في Binder. بالنسبة للخدمات التي يجب فيها تنفيذ المكالمة أحادية الاتجاه في العملية المستهدفة بأولوية عالية، يمكن تغيير سياسة الجدولة الخاصة بالخدمة المتلقية. في لغة C++، يضمن استخدام طريقة libhidltransport setMinSchedulerPolicy مع أولويات وسياسات المجدول المحددة في sched.h أن جميع الاستدعاءات في الخدمة تعمل على الأقل وفقًا لسياسة الجدولة والأولوية المحددة.