diff options
author | Steven Moreland <smoreland@google.com> | 2017-06-08 13:42:05 -0700 |
---|---|---|
committer | Steven Moreland <smoreland@google.com> | 2017-07-20 20:24:48 +0000 |
commit | 151839577f768d888ad150d89c718f8dc4a85159 (patch) | |
tree | 002b87411a7fb7123c3fb53a7d35c8cbdf8f7274 /transport/allocator | |
parent | 25508806b87fc4d428590f06e0b6d361a254355c (diff) | |
download | libhidl-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.hal | 10 | ||||
-rw-r--r-- | transport/allocator/1.0/default/AshmemAllocator.cpp | 68 | ||||
-rw-r--r-- | transport/allocator/1.0/default/AshmemAllocator.h | 2 |
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 |