У меня есть служба Android java, которая будет взаимодействовать с службой HAL
, используя вызовы HIDL
.
У меня есть сценарий ниже, я не уверен, что считаю его критическим.
+----------+ (AIDL) +--------------+
|App thread|-------->|Java Service | (HIDL) +-----------+
+----------+ |(SendFunction)|------->|CPP service|
+--------------+ +-----------+
^
+--------------+ |
|AnotherThread |-----|
+--------------+
Определение SendFunction
приведено ниже.
private void SendFunction(int status, DiagCommandDesc response) {
try {
server.executeCommandResponse(status, response);
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Response sent to HAL.");
}
} catch (Exception e) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "HAL Server error.");
}
}
}
SendFunction
вызывается из двух разных потоков.
Где server
— это экземпляр CPP Server
, использующий HIDL
.
Мой вопрос.
server.executeCommandResponse(status, response);
Нужно ли рассматривать вышеуказанное call
как критическое и синхронизировать его? поскольку объект server
будет доступен из двух разных потоков.
Нет, вам не нужно охранять вызов server.executeCommandResponse(status, response)
в вашей службе Java.
Связь Binder уже является потокобезопасной. Безопасность одновременных вызовов executeCommandResponse
внутри службы HAL должна быть обеспечена самим HAL. Есть простой способ сделать его потокобезопасным на стороне HAL: использовать пул потоков только с одним потоком. Это заставит все остальные потоки ждать завершения первого.
int main()
{
::android::hardware::configureRpcThreadpool(1, true);
::android::sp<MyHal> service = new MyHal;
if (::android::OK != service->registerAsService())
return EXIT_FAILURE;
::android::hardware::joinRpcThreadpool();
return EXIT_SUCCESS;
}
Дополнительную информацию можно найти здесь: https://source.android.com/devices/architecture/hidl/threading