aboutsummaryrefslogtreecommitdiffstats
path: root/vppinfra
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2016-10-13 10:53:26 -0400
committerDave Barach <dave@barachs.net>2016-10-13 10:56:20 -0400
commit241e52222e5e5579516494a8d979b6cc282f4799 (patch)
tree9e188c588358eb559529d51bf97bd06f46f0c843 /vppinfra
parent0683c9cc130d45f1246be78fa4ebf3f8d7f322bb (diff)
Add clib_mem_alloc_or_null(...)
Change-Id: I5177d6d3349384beb551b4f2f52b30b044ce335b Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'vppinfra')
-rw-r--r--vppinfra/vppinfra/mem.h34
-rw-r--r--vppinfra/vppinfra/vec.c8
2 files changed, 32 insertions, 10 deletions
diff --git a/vppinfra/vppinfra/mem.h b/vppinfra/vppinfra/mem.h
index d88254562c0..1260eab28c0 100644
--- a/vppinfra/vppinfra/mem.h
+++ b/vppinfra/vppinfra/mem.h
@@ -67,9 +67,10 @@ clib_mem_set_per_cpu_heap (u8 * new_heap)
return old;
}
-/* Memory allocator which returns null when it fails. */
+/* Memory allocator which may call os_out_of_memory() if it fails */
always_inline void *
-clib_mem_alloc_aligned_at_offset (uword size, uword align, uword align_offset)
+clib_mem_alloc_aligned_at_offset (uword size, uword align, uword align_offset,
+ int os_out_of_memory_on_failure)
{
void *heap, *p;
uword offset, cpu;
@@ -97,25 +98,46 @@ clib_mem_alloc_aligned_at_offset (uword size, uword align, uword align_offset)
}
else
{
- os_out_of_memory ();
+ if (os_out_of_memory_on_failure)
+ os_out_of_memory ();
return 0;
}
}
-/* Memory allocator which returns null when it fails. */
+/* Memory allocator which calls os_out_of_memory() when it fails */
always_inline void *
clib_mem_alloc (uword size)
{
return clib_mem_alloc_aligned_at_offset (size, /* align */ 1,
- /* align_offset */ 0);
+ /* align_offset */ 0,
+ /* os_out_of_memory */ 1);
}
always_inline void *
clib_mem_alloc_aligned (uword size, uword align)
{
- return clib_mem_alloc_aligned_at_offset (size, align, /* align_offset */ 0);
+ return clib_mem_alloc_aligned_at_offset (size, align, /* align_offset */ 0,
+ /* os_out_of_memory */ 1);
}
+/* Memory allocator which calls os_out_of_memory() when it fails */
+always_inline void *
+clib_mem_alloc_or_null (uword size)
+{
+ return clib_mem_alloc_aligned_at_offset (size, /* align */ 1,
+ /* align_offset */ 0,
+ /* os_out_of_memory */ 0);
+}
+
+always_inline void *
+clib_mem_alloc_aligned_or_null (uword size, uword align)
+{
+ return clib_mem_alloc_aligned_at_offset (size, align, /* align_offset */ 0,
+ /* os_out_of_memory */ 0);
+}
+
+
+
/* Memory allocator which panics when it fails.
Use macro so that clib_panic macro can expand __FUNCTION__ and __LINE__. */
#define clib_mem_alloc_aligned_no_fail(size,align) \
diff --git a/vppinfra/vppinfra/vec.c b/vppinfra/vppinfra/vec.c
index f711679b0a4..2d7ae1d4dc6 100644
--- a/vppinfra/vppinfra/vec.c
+++ b/vppinfra/vppinfra/vec.c
@@ -56,9 +56,8 @@ vec_resize_allocate_memory (void *v,
if (!v)
{
- new =
- clib_mem_alloc_aligned_at_offset (data_bytes, data_align,
- header_bytes);
+ new = clib_mem_alloc_aligned_at_offset (data_bytes, data_align, header_bytes, 1 /* yes, call os_out_of_memory */
+ );
data_bytes = clib_mem_size (new);
memset (new, 0, data_bytes);
v = new + header_bytes;
@@ -84,7 +83,8 @@ vec_resize_allocate_memory (void *v,
new =
clib_mem_alloc_aligned_at_offset (new_alloc_bytes, data_align,
- header_bytes);
+ header_bytes,
+ 1 /* yes, call os_out_of_memory */ );
/* FIXME fail gracefully. */
if (!new)