summaryrefslogtreecommitdiff
path: root/transport/allocator
diff options
context:
space:
mode:
authorSteven Moreland <smoreland@google.com>2017-06-08 13:42:05 -0700
committerSteven Moreland <smoreland@google.com>2017-07-20 20:24:48 +0000
commit151839577f768d888ad150d89c718f8dc4a85159 (patch)
tree002b87411a7fb7123c3fb53a7d35c8cbdf8f7274 /transport/allocator
parent25508806b87fc4d428590f06e0b6d361a254355c (diff)
downloadlibhidl-151839577f768d888ad150d89c718f8dc4a85159.tar.gz
Add batching to hidl allocator HAL.
Test: hidl_test Bug: 36727951 Bug: 63899698 Merged-In: I000dcf339dd0b5a8180eb91e0b52979c4fca657b Change-Id: I000dcf339dd0b5a8180eb91e0b52979c4fca657b
Diffstat (limited to 'transport/allocator')
-rw-r--r--transport/allocator/1.0/IAllocator.hal10
-rw-r--r--transport/allocator/1.0/default/AshmemAllocator.cpp68
-rw-r--r--transport/allocator/1.0/default/AshmemAllocator.h2
3 files changed, 71 insertions, 9 deletions
diff --git a/transport/allocator/1.0/IAllocator.hal b/transport/allocator/1.0/IAllocator.hal
index 814c69d..6f531dd 100644
--- a/transport/allocator/1.0/IAllocator.hal
+++ b/transport/allocator/1.0/IAllocator.hal
@@ -29,4 +29,14 @@ interface IAllocator {
* @return memory Unmapped memory object.
*/
allocate(uint64_t size) generates (bool success, memory mem);
+
+ /**
+ * Return memory must have instance name corresponding to this type of memory.
+ *
+ * @param size Size of memory to allocate in bytes.
+ * @param count Number of memory instances to allocate.
+ * @return success Whether allocation succeeded (returns false if any allocation failed).
+ * @return batch Unmapped memory objects.
+ */
+ batchAllocate(uint64_t size, uint64_t count) generates (bool success, vec<memory> batch);
}; \ No newline at end of file
diff --git a/transport/allocator/1.0/default/AshmemAllocator.cpp b/transport/allocator/1.0/default/AshmemAllocator.cpp
index ce6dbf7..0bd4f81 100644
--- a/transport/allocator/1.0/default/AshmemAllocator.cpp
+++ b/transport/allocator/1.0/default/AshmemAllocator.cpp
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+#define LOG_TAG "AshmemAllocator"
+#include <android-base/logging.h>
+
#include "AshmemAllocator.h"
#include <cutils/ashmem.h>
@@ -24,21 +27,70 @@ namespace allocator {
namespace V1_0 {
namespace implementation {
-// Methods from ::android::hidl::allocator::V1_0::IAllocator follow.
-Return<void> AshmemAllocator::allocate(uint64_t size, allocate_cb _hidl_cb) {
+static hidl_memory allocateOne(uint64_t size) {
int fd = ashmem_create_region("AshmemAllocator_hidl", size);
if (fd < 0) {
- _hidl_cb(false /* success */, hidl_memory());
- return Void();
+ LOG(WARNING) << "ashmem_create_region(" << size << ") fails with " << fd;
+ return hidl_memory();
}
native_handle_t* handle = native_handle_create(1, 0);
handle->data[0] = fd;
- hidl_memory memory("ashmem", handle, size);
+ LOG(WARNING) << "ashmem_create_region(" << size << ") returning hidl_memory(" << handle
+ << ", " << size << ")";
+ return hidl_memory("ashmem", handle, size);
+}
+
+static void cleanup(hidl_memory&& memory) {
+ if (memory.handle() == nullptr) {
+ return;
+ }
+
+ native_handle_close(const_cast<native_handle_t *>(memory.handle()));
+ native_handle_delete(const_cast<native_handle_t *>(memory.handle()));
+}
+
+Return<void> AshmemAllocator::allocate(uint64_t size, allocate_cb _hidl_cb) {
+ hidl_memory memory = allocateOne(size);
+ _hidl_cb(memory.handle() != nullptr /* success */, memory);
+ cleanup(std::move(memory));
+
+ return Void();
+}
+
+Return<void> AshmemAllocator::batchAllocate(uint64_t size, uint64_t count, batchAllocate_cb _hidl_cb) {
+ // resize fails if count > 2^32
+ if (count > UINT32_MAX) {
+ _hidl_cb(false /* success */, {});
+ return Void();
+ }
+
+ hidl_vec<hidl_memory> batch;
+ batch.resize(count);
+
+ uint64_t allocated;
+ for (allocated = 0; allocated < count; allocated++) {
+ batch[allocated] = allocateOne(size);
+
+ if (batch[allocated].handle() == nullptr) {
+ LOG(WARNING) << "batchAllocate(" << size << ", " << count << ") fails @ #" << allocated;
+ break;
+ }
+ }
+
+ // batch[i].handle() != nullptr for i in [0, allocated - 1].
+ // batch[i].handle() == nullptr for i in [allocated, count - 1].
+
+ if (allocated < count) {
+ _hidl_cb(false /* success */, {});
+ } else {
+ _hidl_cb(true /* success */, batch);
+ }
+
+ for (uint64_t i = 0; i < allocated; i++) {
+ cleanup(std::move(batch[i]));
+ }
- _hidl_cb(true /* success */, memory);
- native_handle_close(handle);
- native_handle_delete(handle);
return Void();
}
diff --git a/transport/allocator/1.0/default/AshmemAllocator.h b/transport/allocator/1.0/default/AshmemAllocator.h
index 307cb5a..131417d 100644
--- a/transport/allocator/1.0/default/AshmemAllocator.h
+++ b/transport/allocator/1.0/default/AshmemAllocator.h
@@ -39,7 +39,7 @@ using ::android::sp;
struct AshmemAllocator : public IAllocator {
// Methods from ::android::hidl::allocator::V1_0::IAllocator follow.
Return<void> allocate(uint64_t size, allocate_cb _hidl_cb) override;
-
+ Return<void> batchAllocate(uint64_t size, uint64_t count, batchAllocate_cb _hidl_cb) override;
};
} // namespace implementation