Merge "Clear dlerror before executing anything."
diff --git a/base/HidlSupport.cpp b/base/HidlSupport.cpp
index ec5b18f..91d56e7 100644
--- a/base/HidlSupport.cpp
+++ b/base/HidlSupport.cpp
@@ -22,56 +22,40 @@
#include <android-base/logging.h>
#include <android-base/parseint.h>
#include <hidl-util/FQName.h>
-#include <vintf/HalManifest.h>
+#include <vintf/VintfObject.h>
#include <vintf/parse_string.h>
namespace android {
namespace hardware {
-vintf::Transport getTransportForFrameworkPackages(const std::string &name) {
- // TODO(b/34772739): move to framework vintf
- const static std::unordered_map<std::string, vintf::Transport> sTransports {
- {"android.hidl.manager@1.0::IServiceManager", vintf::Transport::HWBINDER},
- {"android.hidl.allocator@1.0::IAllocator" , vintf::Transport::HWBINDER},
- {"android.hidl.memory@1.0::IMapper" , vintf::Transport::PASSTHROUGH},
- {"android.hidl.memory@1.0::IMemory" , vintf::Transport::PASSTHROUGH},
- };
- auto it = sTransports.find(name);
- if (it == sTransports.end()) {
- LOG(ERROR) << "getTransportForFrameworkPackages: Cannot find entry "
- << name << " in the static map. Using default transport.";
- return vintf::Transport::EMPTY;
- } else {
- LOG(INFO) << "getTransportForFrameworkPackages: " << name
- << " declares transport method " << to_string(it->second);
- }
- return it->second;
-}
-vintf::Transport getTransportForHals(const FQName &fqName) {
- const std::string package = fqName.package();
- const vintf::HalManifest *vm = vintf::HalManifest::Get();
+vintf::Transport getTransportFromManifest(
+ const FQName &fqName, const std::string &instanceName,
+ const std::string &manifestName,
+ const vintf::HalManifest *vm) {
if (vm == nullptr) {
- LOG(WARNING) << "getTransportForHals: No VINTF defined, using default transport for "
- << fqName.string() << ".";
+ LOG(WARNING) << "getTransportFromManifest: No " << manifestName << " manifest defined, "
+ << "using default transport for " << fqName.string();
return vintf::Transport::EMPTY;
}
- vintf::Transport tr = vm->getTransport(package,
- vintf::Version{fqName.getPackageMajorVersion(), fqName.getPackageMinorVersion()});
+ vintf::Transport tr = vm->getTransport(fqName.package(),
+ vintf::Version{fqName.getPackageMajorVersion(), fqName.getPackageMinorVersion()},
+ fqName.name(), instanceName);
if (tr == vintf::Transport::EMPTY) {
- LOG(WARNING) << "getTransportForHals: Cannot find entry "
- << package << fqName.atVersion()
- << " in vendor interface manifest. Using default transport.";
+ LOG(WARNING) << "getTransportFromManifest: Cannot find entry "
+ << fqName.string()
+ << " in " << manifestName << " manifest, using default transport.";
} else {
- LOG(INFO) << "getTransportForHals: " << package << fqName.atVersion()
- << " declares transport method " << to_string(tr);
+ LOG(DEBUG) << "getTransportFromManifest: " << fqName.string()
+ << " declares transport method " << to_string(tr)
+ << " in " << manifestName << " manifest";
}
return tr;
}
-vintf::Transport getTransport(const std::string &name) {
- FQName fqName(name);
+vintf::Transport getTransport(const std::string &interfaceName, const std::string &instanceName) {
+ FQName fqName(interfaceName);
if (!fqName.isValid()) {
- LOG(ERROR) << "getTransport: " << name << " is not a valid fully-qualified name.";
+ LOG(ERROR) << "getTransport: " << interfaceName << " is not a valid fully-qualified name.";
return vintf::Transport::EMPTY;
}
if (!fqName.hasVersion()) {
@@ -79,10 +63,18 @@
<< " does not specify a version. Using default transport.";
return vintf::Transport::EMPTY;
}
- if (fqName.inPackage("android.hidl")) {
- return getTransportForFrameworkPackages(name);
+ if (fqName.name().empty()) {
+ LOG(ERROR) << "getTransport: " << fqName.string()
+ << " does not specify an interface name. Using default transport.";
+ return vintf::Transport::EMPTY;
}
- return getTransportForHals(fqName);
+ // TODO(b/34772739): modify the list if other packages are added to system/manifest.xml
+ if (fqName.inPackage("android.hidl")) {
+ return getTransportFromManifest(fqName, instanceName, "framework",
+ vintf::VintfObject::GetFrameworkHalManifest());
+ }
+ return getTransportFromManifest(fqName, instanceName, "device",
+ vintf::VintfObject::GetDeviceHalManifest());
}
hidl_handle::hidl_handle() {
@@ -239,6 +231,11 @@
hidl_string &hidl_string::operator=(const char *s) {
clear();
+
+ if (s == nullptr) {
+ return *this;
+ }
+
copyFrom(s, strlen(s));
return *this;
}
@@ -275,11 +272,12 @@
void hidl_string::moveFrom(hidl_string &&other) {
// assume my resources are freed.
- mBuffer = other.mBuffer;
+ mBuffer = std::move(other.mBuffer);
mSize = other.mSize;
mOwnsBuffer = other.mOwnsBuffer;
other.mOwnsBuffer = false;
+ other.clear();
}
void hidl_string::clear() {
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index d22c257..a16701b 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -57,9 +57,11 @@
namespace hardware {
// Get transport method from vendor interface manifest.
-// name has the format "android.hardware.foo@1.0::IFoo"
+// interfaceName has the format "android.hardware.foo@1.0::IFoo"
+// instanceName is "default", "ashmem", etc.
// If it starts with "android.hidl.", a static map is looked up instead.
-vintf::Transport getTransport(const std::string &name);
+vintf::Transport getTransport(const std::string &interfaceName,
+ const std::string &instanceName);
// hidl_death_recipient is a callback interfaced that can be used with
// linkToDeath() / unlinkToDeath()
@@ -234,7 +236,23 @@
return *this;
}
- // TODO move constructor/move assignment
+ // move constructor
+ hidl_memory(hidl_memory&& other) {
+ *this = std::move(other);
+ }
+
+ // move assignment
+ hidl_memory &operator=(hidl_memory &&other) {
+ if (this != &other) {
+ mHandle = std::move(other.mHandle);
+ mSize = other.mSize;
+ mName = std::move(other.mName);
+ other.mSize = 0;
+ }
+
+ return *this;
+ }
+
~hidl_memory() {
}
diff --git a/manifest.xml b/manifest.xml
new file mode 100644
index 0000000..8d6697b
--- /dev/null
+++ b/manifest.xml
@@ -0,0 +1,31 @@
+<!-- TODO(b/35434793): move to frameworks/interfaces -->
+
+<manifest version="1.0">
+ <hal>
+ <name>android.hidl.manager</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IServiceManager</name>
+ <instance>manager</instance>
+ </interface>
+ </hal>
+ <hal>
+ <name>android.hidl.allocator</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IAllocator</name>
+ <instance>ashmem</instance>
+ </interface>
+ </hal>
+ <hal>
+ <name>android.hidl.memory</name>
+ <transport>passthrough</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IMapper</name>
+ <instance>ashmem</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/test_main.cpp b/test_main.cpp
index 6bd7f83..4f59371 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -61,6 +61,8 @@
EXPECT_STREQ(s2.c_str(), "s2");
hidl_string s2a(nullptr); // copy constructor from null cstr
EXPECT_STREQ("", s2a);
+ s2a = nullptr; // = from nullptr cstr
+ EXPECT_STREQ(s2a.c_str(), "");
hidl_string s3 = hidl_string("s3"); // move =
EXPECT_STREQ(s3.c_str(), "s3");
hidl_string s4 = hidl_string("12345", 3); // copy constructor from cstr w/ length
diff --git a/transport/LegacySupport.cpp b/transport/LegacySupport.cpp
index 17371d4..95796bf 100644
--- a/transport/LegacySupport.cpp
+++ b/transport/LegacySupport.cpp
@@ -15,36 +15,39 @@
*/
#define LOG_TAG "libhidltransport"
+#include <inttypes.h>
+
#include <hidl/LegacySupport.h>
#include <chrono>
-#include <cutils/properties.h>
#include <thread>
#include <utils/misc.h>
#include <utils/Log.h>
+#include <utils/SystemClock.h>
+
+#include <android-base/properties.h>
namespace android {
namespace hardware {
-static const char* kDataProperty = "vold.post_fs_data_done";
-
-void waitForData() {
- using namespace std::literals::chrono_literals;
-
- // TODO(b/34274385) remove this
- while (!property_get_bool(kDataProperty, false)) {
- std::this_thread::sleep_for(300ms);
- }
-
- // TODO(b/35178781) wait a bit longer
- std::this_thread::sleep_for(300ms);
-}
-
namespace details {
+using android::base::GetBoolProperty;
+using android::base::GetUintProperty;
+using android::base::WaitForPropertyCreation;
+
+static const char* kPersistPropReadyProperty = "ro.boottime.persistent_properties";
+static const char* kBinderizationProperty = "persist.hal.binderization";
+
bool blockingHalBinderizationEnabled() {
- waitForData();
- return property_get_bool("persist.hal.binderization", false);
+ uint64_t t = GetUintProperty<uint64_t>(kPersistPropReadyProperty, 0, UINT64_MAX);
+ if (t == 0) { // not set yet
+ int64_t startTime = elapsedRealtime();
+ WaitForPropertyCreation(kPersistPropReadyProperty, std::chrono::milliseconds::max());
+ ALOGI("Waiting for %s took %" PRId64 " ms", kPersistPropReadyProperty,
+ elapsedRealtime() - startTime);
+ }
+ return GetBoolProperty(kBinderizationProperty, false);
}
void blockIfBinderizationDisabled(const std::string& interface,
@@ -58,7 +61,7 @@
std::string package = interface.substr(0, loc);
// only block if this is supposed to be toggled
- if (getTransport(interface) != vintf::Transport::TOGGLED) {
+ if (getTransport(interface, instance) != vintf::Transport::TOGGLED) {
return;
}
diff --git a/transport/token/1.0/ITokenManager.hal b/transport/token/1.0/ITokenManager.hal
index 2f0650b..b1bb735 100644
--- a/transport/token/1.0/ITokenManager.hal
+++ b/transport/token/1.0/ITokenManager.hal
@@ -23,9 +23,8 @@
interface ITokenManager {
/**
- * Register an interface. The server must only keep a weak reference
- * to the token. The lifetime of the token is thus linked to the
- * lifetime of the stored interface.
+ * Register an interface. The server must keep a strong reference
+ * to the interface until the token is destroyed by calling unregister.
*
* @param store Interface which can later be fetched with the returned token.
* @return token Opaque value which may be used as inputs to other functions.
@@ -33,20 +32,17 @@
createToken(interface store) generates (uint64_t token);
/**
- * Explicitly unregister an interface. If the server still holds a weak reference
- * to an interface, but that interface interface is deleted and the reference
- * cannot be promoted, then success must be false.
+ * Destory a token and the strong reference to the associated interface.
*
- * @param token Token recieved from createToken
- * @return success Whether or not an interface was successfully unregistered.
+ * @param token Token received from createToken
+ * @return success Whether or not the token was successfully unregistered.
*/
unregister(uint64_t token) generates (bool success);
/**
- * Fetches an interface from a provided token. This must also unregister the
- * token.
+ * Fetch an interface from a provided token.
*
- * @param token Token recieved from createToken
+ * @param token Token received from createToken
* @return store Interface registered with createToken and the corresponding
* token or nullptr.
*/