You can have as many heaps as you need. There is no inherent limit. The 
constant CLIB_MAX_MHEAPS has to do with the number of distinct thread-id’s 
which os_get_thread_index() will return.

This guitar-lick means “temporarily use the supplied heap for all allocations”:

  void *oldheap = clib_mem_set_heap (heap);
      pool_get() / vec_validate() / clib_mem_alloc() etc. as desired
  clib_mem_set_heap(oldheap); // back to the previous heap, usually the shared 
global heap...

Required when allocating / free memory in the binary API segment, and in 
private heaps.

Note that clib_mem_alloc() and variants mean “allocate memory from the current 
per-thread heap,” which is easily changed for a moment as shown above.

Please read through src/vppinfra/{mem.h, dlmalloc.[ch]} carefully and 
understand what’s going on before you jump in.

D.

From: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> On Behalf Of Harish Patil
Sent: Wednesday, December 5, 2018 4:31 PM
To: vpp-dev@lists.fd.io
Subject: [vpp-dev] Heap allocation

Hi,

I would like to pre-allocate separate heap space (outside of main heap) and be 
able to use the returned memory for my application's memory needs (just like 
malloc()). It seems we can have up to 256 heaps. Have few questions around this:

1) My understanding is that currently the main heap is allocated using 
clib_mem_init()/clib_mem_init_thread_safe() and the subsequent calls like 
clib_mem_alloc(size) will carve out memory from within the main heap and 
returned to clients (similar to glibc malloc()). Is this correct? If so, I 
would like to know how this is achieved since I don't see the returned pointer 
from clib_mem_init()/clib_mem_init_thread_safe() is being referenced or used 
anywhere.

2) Some applications are using mheap_alloc() directly to create new heap.
Ex:
void *heap;
void *oldheap;
heap = mheap_alloc (0, 10<<20);
oldheap = clib_mem_set_heap (heap);
..
..
clib_mem_set_heap (oldheap); << why is this required to write back oldheap into 
per-cpu heap?

What I really like to know is once the heap is allocated how can we use it? 
Does it imply to have pools/hashes to be created to be able to use it? I'm 
expecting something which takes void *heap (created using mheap_alloc) and 
returns the requested memory for a given size from within the heap so that we 
don't need to use pools/hashes.
Ex: void *foobar(void *mheap, size_t size);
Is it possible?
Thanks,

Harish
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#11504): https://lists.fd.io/g/vpp-dev/message/11504
Mute This Topic: https://lists.fd.io/mt/28617718/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to