[Mesa-dev] [PATCH 2/3] u_dynarray: return 0 on realloc failure

Nicolai Hähnle nhaehnle at gmail.com
Sat May 4 13:25:21 UTC 2019


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

We're not very good at handling out-of-memory conditions in general, but
this change at least gives the caller the option of handling it.

This happens to fix an error in out-of-memory handling in i965, which has
the following code in brw_bufmgr.c:

      node = util_dynarray_grow(vma_list, sizeof(struct vma_bucket_node));
      if (unlikely(!node))
         return 0ull;

Previously, allocation failure for util_dynarray_grow wouldn't actually
return NULL when the dynarray was previously non-empty.
---
 src/util/u_dynarray.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/util/u_dynarray.h b/src/util/u_dynarray.h
index b30fd7b1154..f6a81609dbe 100644
--- a/src/util/u_dynarray.h
+++ b/src/util/u_dynarray.h
@@ -85,20 +85,22 @@ util_dynarray_ensure_cap(struct util_dynarray *buf, unsigned newcap)
          buf->capacity = DYN_ARRAY_INITIAL_SIZE;
 
       while (newcap > buf->capacity)
          buf->capacity *= 2;
 
       if (buf->mem_ctx) {
          buf->data = reralloc_size(buf->mem_ctx, buf->data, buf->capacity);
       } else {
          buf->data = realloc(buf->data, buf->capacity);
       }
+      if (!buf->data)
+         return 0;
    }
 
    return (void *)((char *)buf->data + buf->size);
 }
 
 static inline void *
 util_dynarray_grow_cap(struct util_dynarray *buf, int diff)
 {
    return util_dynarray_ensure_cap(buf, buf->size + diff);
 }
-- 
2.20.1



More information about the mesa-dev mailing list