diff options
author | 2018-08-16 07:07:38 -0700 | |
---|---|---|
committer | 2018-08-16 07:11:02 -0700 | |
commit | afcf8a0ca10bb618f0a259952a82738fd267348f (patch) | |
tree | 4c01894ef2e430be3c3c432f039aacd7dde60bc8 | |
parent | 938b9a40787028c58fb548fa6ada8c0dd8180f35 (diff) |
Don't let 0-sized arrays trip the allocator.
PiperOrigin-RevId: 208978749
-rw-r--r-- | tensorflow/contrib/lite/toco/allocate_transient_arrays.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/tensorflow/contrib/lite/toco/allocate_transient_arrays.cc b/tensorflow/contrib/lite/toco/allocate_transient_arrays.cc index 1f3ea2e1c7..18c904c6d4 100644 --- a/tensorflow/contrib/lite/toco/allocate_transient_arrays.cc +++ b/tensorflow/contrib/lite/toco/allocate_transient_arrays.cc @@ -106,6 +106,17 @@ class Allocator { // Core allocation routine. void Allocate(std::size_t size, Alloc* result) { + if (size == 0) { + // zero-sized arrays get a dummy alloc of (0, 0) that does not + // need to be kept in the books (no need to insert that into + // live_allocs_). + // Note: zero-sized arrays shouldn't exist, but handling that case + // here allows such pathological cases to get a cleaner error message + // later instead of generating spurious allocator failures. + result->start = 0; + result->end = 0; + return; + } // Naive algorithm: pick the first gap between live allocations, // that is wide enough for the new array. std::size_t pos = 0; @@ -128,6 +139,11 @@ class Allocator { } void Deallocate(const Alloc& a) { + // Special-case dummy allocs for zero-sized arrays. + if (a.start == 0 && a.end == 0) { + // Nothing needs to be done, these aren't kept in the books. + return; + } auto iter = std::lower_bound(live_allocs_.begin(), live_allocs_.end(), a); CHECK(iter != live_allocs_.end()); CHECK(*iter == a); |