我是否需要将以下情况视为关键情况?
Do I need to treat the below scenario as critical?
我有 Android java 服务,它将使用 HIDL
调用与 HAL
服务交互。
我有以下情况,我不确定是否将其视为关键。
+----------+ (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
对象将从两个不同的线程访问。
不,您不必在 Java 服务中保护对 server.executeCommandResponse(status, response)
的调用。
Binder 通信已经是线程安全的。 HAL 本身必须确保对 executeCommandResponse
的并发调用在 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
我有 Android java 服务,它将使用 HIDL
调用与 HAL
服务交互。
我有以下情况,我不确定是否将其视为关键。
+----------+ (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
对象将从两个不同的线程访问。
不,您不必在 Java 服务中保护对 server.executeCommandResponse(status, response)
的调用。
Binder 通信已经是线程安全的。 HAL 本身必须确保对 executeCommandResponse
的并发调用在 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