Merge "Allow MQDescriptors with null native_handles to be passed over hwbinder"
diff --git a/transport/Android.bp b/transport/Android.bp
index b1df04e..1c1a310 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -58,6 +58,7 @@
     srcs: [
         "HidlBinderSupport.cpp",
         "HidlPassthroughSupport.cpp",
+        "HidlTransportSupport.cpp",
         "LegacySupport.cpp",
         "ServiceManagement.cpp",
         "Static.cpp"
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
new file mode 100644
index 0000000..a5ec8e2
--- /dev/null
+++ b/transport/HidlTransportSupport.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <hidl/HidlTransportSupport.h>
+
+#include <hidl/HidlBinderSupport.h>
+
+namespace android {
+namespace hardware {
+
+void configureRpcThreadpool(size_t maxThreads, bool callerWillJoin) {
+    // TODO(b/32756130) this should be transport-dependent
+    configureBinderRpcThreadpool(maxThreads, callerWillJoin);
+}
+void joinRpcThreadpool() {
+    // TODO(b/32756130) this should be transport-dependent
+    joinBinderRpcThreadpool();
+}
+
+}
+}
\ No newline at end of file
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index a1e570f..15abb92 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -186,8 +186,7 @@
         return nullptr;
     }
 
-    Return<bool> add(const hidl_vec<hidl_string>& /* interfaceChain */,
-                     const hidl_string& /* name */,
+    Return<bool> add(const hidl_string& /* name */,
                      const sp<IBase>& /* service */) override {
         LOG(FATAL) << "Cannot register services with passthrough service manager.";
         return false;
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index 86379a9..8476f47 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -40,18 +40,12 @@
  *   configureRpcThreadPool(1, true); // transport won't launch any threads by itself
  *
  */
-inline void configureRpcThreadpool(size_t maxThreads, bool callerWillJoin) {
-    // TODO(b/32756130) this should be transport-dependent
-    configureBinderRpcThreadpool(maxThreads, callerWillJoin);
-}
+void configureRpcThreadpool(size_t maxThreads, bool callerWillJoin);
 
 /* Joins a threadpool that you configured earlier with
  * configureRpcThreadPool(x, true);
  */
-inline void joinRpcThreadpool() {
-    // TODO(b/32756130) this should be transport-dependent
-    joinBinderRpcThreadpool();
-}
+void joinRpcThreadpool();
 
 // cast the interface IParent to IChild.
 // Return nullptr if parent is null or any failure.
diff --git a/transport/manager/1.0/IServiceManager.hal b/transport/manager/1.0/IServiceManager.hal
index 2bbbe22..77cf253 100644
--- a/transport/manager/1.0/IServiceManager.hal
+++ b/transport/manager/1.0/IServiceManager.hal
@@ -52,23 +52,26 @@
     get(string fqName, string name) generates (interface service);
 
     /**
-     * Register a service. The service manager must be registered as all of the
-     * services that it inherits from.
+     * Register a service. The service manager must retrieve the (inherited)
+     * interfaces that this service implements, and register them along with
+     * the service.
+     *
+     * Each interface must have its own namespace for instance names. If you
+     * have two unrelated interfaces IFoo and IBar, it must be valid to call:
+     *
+     * add("my_instance", foo); // foo implements IFoo
+     * add("my_instance", bar); // bar implements IBar
      *
      * WARNING: This function is for libhidl/HwBinder use only. You are likely
      * looking for 'INTERFACE::registerAsService("name")' instead.
      *
-     * @param interfaceChain List of fully-qualified interface names. The first
-     *                       must be the actual interface name. Subsequent names must
-     *                       follow the inheritance hierarchy of the interface.
      * @param name           Instance name. Must also be used to retrieve service.
      * @param service        Handle to registering service.
      *
      * @return success       Whether or not the service was registered.
      *
      */
-    add(vec<string> interfaceChain, string name, interface service)
-        generates (bool success);
+    add(string name, interface service) generates (bool success);
 
     /**
      * List all registered services. Must be sorted.