Merge "hidl_string: Add cstr + length constructor"
diff --git a/base/include/hidl/MQDescriptor.h b/base/include/hidl/MQDescriptor.h
index ed9279a..8cdbd4c 100644
--- a/base/include/hidl/MQDescriptor.h
+++ b/base/include/hidl/MQDescriptor.h
@@ -21,6 +21,7 @@
#include <cutils/native_handle.h>
#include <hidl/HidlSupport.h>
#include <utils/NativeHandle.h>
+#include <utils/Log.h>
namespace android {
namespace hardware {
@@ -107,6 +108,18 @@
* needed for blocking FMQ operations.
*/
static constexpr int32_t kMinGrantorCountForEvFlagSupport = EVFLAGWORDPOS + 1;
+
+ //TODO(b/34160777) Identify a better solution that supports remoting.
+ static inline size_t alignToWordBoundary(size_t length) {
+ constexpr size_t kAlignmentSize = 64;
+ LOG_ALWAYS_FATAL_IF(kAlignmentSize % __WORDSIZE != 0, "Incompatible word size");
+ return (length + kAlignmentSize/8 - 1) & ~(kAlignmentSize/8 - 1U);
+ }
+
+ static inline size_t isAlignedToWordBoundary(size_t offset) {
+ constexpr size_t kAlignmentSize = 64;
+ return (offset & (kAlignmentSize/8 - 1)) == 0;
+ }
private:
::android::hardware::hidl_vec<GrantorDescriptor> mGrantors;
::android::hardware::details::hidl_pointer<native_handle_t> mHandle;
@@ -144,6 +157,8 @@
mFlags(flavor) {
mGrantors.resize(grantors.size());
for (size_t i = 0; i < grantors.size(); ++i) {
+ LOG_ALWAYS_FATAL_IF(isAlignedToWordBoundary(grantors[i].offset) == false,
+ "Grantor offsets need to be aligned");
mGrantors[i] = grantors[i];
}
}
@@ -176,7 +191,7 @@
mGrantors[grantorPos] = {
0 /* grantor flags */,
0 /* fdIndex */,
- static_cast<uint32_t>(offset),
+ static_cast<uint32_t>(alignToWordBoundary(offset)),
memSize[grantorPos]
};
}
diff --git a/transport/HidlBinderSupport.cpp b/transport/HidlBinderSupport.cpp
index 38e0640..6be7254 100644
--- a/transport/HidlBinderSupport.cpp
+++ b/transport/HidlBinderSupport.cpp
@@ -30,22 +30,20 @@
status_t readEmbeddedFromParcel(hidl_memory * /* memory */,
const Parcel &parcel, size_t parentHandle, size_t parentOffset) {
- ::android::status_t _hidl_err = ::android::OK;
- const native_handle_t *_hidl_memory_handle = parcel.readEmbeddedNativeHandle(
+ const native_handle_t *handle;
+ ::android::status_t _hidl_err = parcel.readNullableEmbeddedNativeHandle(
parentHandle,
- parentOffset + hidl_memory::kOffsetOfHandle);
+ parentOffset + hidl_memory::kOffsetOfHandle,
+ &handle);
- if (_hidl_memory_handle == nullptr) {
- _hidl_err = ::android::UNKNOWN_ERROR;
- return _hidl_err;
+ if (_hidl_err == ::android::OK) {
+ _hidl_err = readEmbeddedFromParcel(
+ (hidl_string*) nullptr,
+ parcel,
+ parentHandle,
+ parentOffset + hidl_memory::kOffsetOfName);
}
- _hidl_err = readEmbeddedFromParcel(
- (hidl_string*) nullptr,
- parcel,
- parentHandle,
- parentOffset + hidl_memory::kOffsetOfName);
-
return _hidl_err;
}
@@ -71,12 +69,12 @@
status_t readEmbeddedFromParcel(hidl_string * /* string */,
const Parcel &parcel, size_t parentHandle, size_t parentOffset) {
- const void *ptr = parcel.readEmbeddedBuffer(
+ const void *out;
+ return parcel.readEmbeddedBuffer(
nullptr /* buffer_handle */,
parentHandle,
- parentOffset + hidl_string::kOffsetOfBuffer);
-
- return ptr != NULL ? OK : UNKNOWN_ERROR;
+ parentOffset + hidl_string::kOffsetOfBuffer,
+ &out);
}
status_t writeEmbeddedToParcel(const hidl_string &string,
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 6753cb8..1e6e3df 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -29,12 +29,12 @@
#include <unistd.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
-#include <android/hidl/manager/1.0/BpServiceManager.h>
-#include <android/hidl/manager/1.0/BnServiceManager.h>
+#include <android/hidl/manager/1.0/BpHwServiceManager.h>
+#include <android/hidl/manager/1.0/BnHwServiceManager.h>
using android::hidl::manager::V1_0::IServiceManager;
-using android::hidl::manager::V1_0::BpServiceManager;
-using android::hidl::manager::V1_0::BnServiceManager;
+using android::hidl::manager::V1_0::BpHwServiceManager;
+using android::hidl::manager::V1_0::BnHwServiceManager;
namespace android {
namespace hardware {
@@ -50,7 +50,7 @@
{
AutoMutex _l(gDefaultServiceManagerLock);
while (gDefaultServiceManager == NULL) {
- gDefaultServiceManager = fromBinder<IServiceManager, BpServiceManager, BnServiceManager>(
+ gDefaultServiceManager = fromBinder<IServiceManager, BpHwServiceManager, BnHwServiceManager>(
ProcessState::self()->getContextObject(NULL));
if (gDefaultServiceManager == NULL)
sleep(1);
diff --git a/transport/base/1.0/Android.bp b/transport/base/1.0/Android.bp
index 0bb6b4a..1b68720 100644
--- a/transport/base/1.0/Android.bp
+++ b/transport/base/1.0/Android.bp
@@ -22,8 +22,8 @@
out: [
"android/hidl/base/1.0/IBase.h",
"android/hidl/base/1.0/IHwBase.h",
- "android/hidl/base/1.0/BnBase.h",
- "android/hidl/base/1.0/BpBase.h",
+ "android/hidl/base/1.0/BnHwBase.h",
+ "android/hidl/base/1.0/BpHwBase.h",
"android/hidl/base/1.0/BsBase.h",
],
}
diff --git a/transport/include/hidl/HidlBinderSupport.h b/transport/include/hidl/HidlBinderSupport.h
index cad68be..d0ad3fb 100644
--- a/transport/include/hidl/HidlBinderSupport.h
+++ b/transport/include/hidl/HidlBinderSupport.h
@@ -26,7 +26,7 @@
#include <hwbinder/IPCThreadState.h>
#include <hwbinder/Parcel.h>
#include <hwbinder/ProcessState.h>
-#include <android/hidl/base/1.0/BnBase.h>
+#include <android/hidl/base/1.0/BnHwBase.h>
// Defines functions for hidl_string, hidl_version, Status, hidl_vec, MQDescriptor,
// etc. to interact with Parcel.
@@ -95,12 +95,12 @@
size_t parentHandle,
size_t parentOffset,
size_t *handle) {
- const void *ptr = parcel.readEmbeddedBuffer(
+ const void *out;
+ return parcel.readEmbeddedBuffer(
handle,
parentHandle,
- parentOffset + hidl_vec<T>::kOffsetOfBuffer);
-
- return ptr != NULL ? OK : UNKNOWN_ERROR;
+ parentOffset + hidl_vec<T>::kOffsetOfBuffer,
+ &out);
}
template<typename T>
@@ -144,14 +144,13 @@
if (_hidl_err != ::android::OK) { return _hidl_err; }
- const native_handle_t *_hidl_mq_handle_ptr = parcel.readEmbeddedNativeHandle(
+ const native_handle_t *_hidl_mq_handle_ptr;
+ _hidl_err = parcel.readEmbeddedNativeHandle(
parentHandle,
- parentOffset + MQDescriptor<T, flavor>::kOffsetOfHandle);
+ parentOffset + MQDescriptor<T, flavor>::kOffsetOfHandle,
+ &_hidl_mq_handle_ptr);
- if (_hidl_mq_handle_ptr == nullptr) {
- _hidl_err = ::android::UNKNOWN_ERROR;
- return _hidl_err;
- }
+ if (_hidl_err != ::android::OK) { return _hidl_err; }
return _hidl_err;
}
@@ -338,7 +337,7 @@
template <typename IType, typename ProxyType, typename StubType>
sp<IType> fromBinder(const sp<IBinder>& binderIface) {
using ::android::hidl::base::V1_0::IBase;
- using ::android::hidl::base::V1_0::BnBase;
+ using ::android::hidl::base::V1_0::BnHwBase;
if (binderIface.get() == nullptr) {
return nullptr;
@@ -346,7 +345,7 @@
if (binderIface->localBinder() == nullptr) {
return new ProxyType(binderIface);
}
- sp<IBase> base = static_cast<BnBase*>(binderIface.get())->getImpl();
+ sp<IBase> base = static_cast<BnHwBase*>(binderIface.get())->getImpl();
if (canCastInterface(base.get(), IType::descriptor)) {
StubType* stub = static_cast<StubType*>(binderIface.get());
return stub->getImpl();
diff --git a/transport/manager/1.0/Android.bp b/transport/manager/1.0/Android.bp
index 5cd06d6..b8e1987 100644
--- a/transport/manager/1.0/Android.bp
+++ b/transport/manager/1.0/Android.bp
@@ -25,13 +25,13 @@
out: [
"android/hidl/manager/1.0/IServiceManager.h",
"android/hidl/manager/1.0/IHwServiceManager.h",
- "android/hidl/manager/1.0/BnServiceManager.h",
- "android/hidl/manager/1.0/BpServiceManager.h",
+ "android/hidl/manager/1.0/BnHwServiceManager.h",
+ "android/hidl/manager/1.0/BpHwServiceManager.h",
"android/hidl/manager/1.0/BsServiceManager.h",
"android/hidl/manager/1.0/IServiceNotification.h",
"android/hidl/manager/1.0/IHwServiceNotification.h",
- "android/hidl/manager/1.0/BnServiceNotification.h",
- "android/hidl/manager/1.0/BpServiceNotification.h",
+ "android/hidl/manager/1.0/BnHwServiceNotification.h",
+ "android/hidl/manager/1.0/BpHwServiceNotification.h",
"android/hidl/manager/1.0/BsServiceNotification.h",
],
}
diff --git a/transport/memory/1.0/Android.bp b/transport/memory/1.0/Android.bp
index efebe7e..ca8341d 100644
--- a/transport/memory/1.0/Android.bp
+++ b/transport/memory/1.0/Android.bp
@@ -28,18 +28,18 @@
out: [
"android/hidl/memory/1.0/IAllocator.h",
"android/hidl/memory/1.0/IHwAllocator.h",
- "android/hidl/memory/1.0/BnAllocator.h",
- "android/hidl/memory/1.0/BpAllocator.h",
+ "android/hidl/memory/1.0/BnHwAllocator.h",
+ "android/hidl/memory/1.0/BpHwAllocator.h",
"android/hidl/memory/1.0/BsAllocator.h",
"android/hidl/memory/1.0/IMapper.h",
"android/hidl/memory/1.0/IHwMapper.h",
- "android/hidl/memory/1.0/BnMapper.h",
- "android/hidl/memory/1.0/BpMapper.h",
+ "android/hidl/memory/1.0/BnHwMapper.h",
+ "android/hidl/memory/1.0/BpHwMapper.h",
"android/hidl/memory/1.0/BsMapper.h",
"android/hidl/memory/1.0/IMemory.h",
"android/hidl/memory/1.0/IHwMemory.h",
- "android/hidl/memory/1.0/BnMemory.h",
- "android/hidl/memory/1.0/BpMemory.h",
+ "android/hidl/memory/1.0/BnHwMemory.h",
+ "android/hidl/memory/1.0/BpHwMemory.h",
"android/hidl/memory/1.0/BsMemory.h",
],
}
diff --git a/transport/token/1.0/Android.bp b/transport/token/1.0/Android.bp
index 0ebe1e4..9113e41 100644
--- a/transport/token/1.0/Android.bp
+++ b/transport/token/1.0/Android.bp
@@ -22,8 +22,8 @@
out: [
"android/hidl/token/1.0/ITokenManager.h",
"android/hidl/token/1.0/IHwTokenManager.h",
- "android/hidl/token/1.0/BnTokenManager.h",
- "android/hidl/token/1.0/BpTokenManager.h",
+ "android/hidl/token/1.0/BnHwTokenManager.h",
+ "android/hidl/token/1.0/BpHwTokenManager.h",
"android/hidl/token/1.0/BsTokenManager.h",
],
}
diff --git a/transport/token/1.0/ITokenManager.hal b/transport/token/1.0/ITokenManager.hal
index dc4134a..2f0650b 100644
--- a/transport/token/1.0/ITokenManager.hal
+++ b/transport/token/1.0/ITokenManager.hal
@@ -43,7 +43,8 @@
unregister(uint64_t token) generates (bool success);
/**
- * Fetches an interface from a provided token.
+ * Fetches an interface from a provided token. This must also unregister the
+ * token.
*
* @param token Token recieved from createToken
* @return store Interface registered with createToken and the corresponding