我是否需要将以下情况视为紧急情况?

问题描述 投票:2回答:1

我有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.");
         }
      }
  } 
从两个不同的线程中调用

SendFunctionserver是使用CPP ServerHIDL的实例。

我的问题。

      server.executeCommandResponse(status, response);

我是否需要将call以上视为关键并进行同步?因为server对象将从两个不同的线程访问。

java android aidl hal hidl
1个回答
2
投票
否,您不必保护Java服务中对server.executeCommandResponse(status, response)的呼叫。

Binder通信已经是线程安全的。 HAL服务内部必须确保并发对executeCommandResponse的调用是安全的。有一种简单的方法可以使其在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
© www.soinside.com 2019 - 2024. All rights reserved.