Add clib_mem_alloc_or_null(...) 00/3400/1
authorDave Barach <[email protected]>
Thu, 13 Oct 2016 14:53:26 +0000 (10:53 -0400)
committerDave Barach <[email protected]>
Thu, 13 Oct 2016 14:56:20 +0000 (10:56 -0400)
Change-Id: I5177d6d3349384beb551b4f2f52b30b044ce335b
Signed-off-by: Dave Barach <[email protected]>
svm/svm.h
vlib/vlib/node.c
vppinfra/vppinfra/mem.h
vppinfra/vppinfra/vec.c

index 5b95abb..0b87dbc 100644 (file)
--- a/svm/svm.h
+++ b/svm/svm.h
@@ -149,7 +149,8 @@ svm_mem_alloc_aligned_at_offset (svm_region_t * rp,
 
   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);
index e18567b..69bb07f 100644 (file)
@@ -375,7 +375,8 @@ register_node (vlib_main_t * vm, vlib_node_registration_t * r)
 
        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);
index d882545..1260eab 100644 (file)
@@ -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)                             \
index f711679..2d7ae1d 100644 (file)
@@ -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)