pthread_mutex_lock (&rp->mutex);
oldheap = clib_mem_set_heap (rp->data_heap);
- rv = clib_mem_alloc_aligned_at_offset (size, align, offset);
+ rv = clib_mem_alloc_aligned_at_offset (size, align, offset,
+ 1 /* yes, call os_out_of_memory */ );
clib_mem_set_heap (oldheap);
pthread_mutex_unlock (&rp->mutex);
return (rv);
p = clib_mem_alloc_aligned_at_offset
(sizeof (p[0]) + (1 << log2_n_stack_bytes),
- STACK_ALIGN, STRUCT_OFFSET_OF (vlib_process_t, stack));
+ STACK_ALIGN, STRUCT_OFFSET_OF (vlib_process_t, stack),
+ 0 /* no, don't call os_out_of_memory */ );
if (p == 0)
clib_panic ("failed to allocate process stack (%d bytes)",
1 << log2_n_stack_bytes);
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;
}
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) \
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;
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)