- u32 pagesize = clib_mem_get_page_size ();
- u32 rnd_size = 0;
- u8 *heap;
-
- rnd_size = clib_max (ssvm->ssvm_size + (pagesize - 1), ssvm->ssvm_size);
- rnd_size &= ~(pagesize - 1);
-
-#if USE_DLMALLOC == 0
- {
- mheap_t *heap_header;
-
- heap = mheap_alloc (0, rnd_size);
- if (heap == 0)
- {
- clib_unix_warning ("mheap alloc");
- return -1;
- }
- heap_header = mheap_header (heap);
- heap_header->flags |= MHEAP_FLAG_THREAD_SAFE;
- }
-#else
- heap = create_mspace (rnd_size, 1 /* locked */ );
- mspace_disable_expand (heap);
-#endif
+ clib_mem_heap_t *heap, *oldheap;
+
+ log2_page_size = clib_mem_get_log2_page_size ();
+ if (log2_page_size == 0)
+ {
+ clib_unix_warning ("cannot determine page size");
+ return SSVM_API_ERROR_CREATE_FAILURE;
+ }
+
+ page_size = 1ULL << log2_page_size;
+ rnd_size = clib_max (ssvm->ssvm_size + (page_size - 1), ssvm->ssvm_size);
+ rnd_size &= ~(page_size - 1);
+
+ sh = clib_mem_vm_map (0, rnd_size + page_size, log2_page_size,
+ (char *) ssvm->name);
+ if (sh == CLIB_MEM_VM_MAP_FAILED)
+ {
+ clib_unix_warning ("private map failed");
+ return SSVM_API_ERROR_CREATE_FAILURE;
+ }
+
+ heap = clib_mem_create_heap ((u8 *) sh + page_size, rnd_size,
+ 1 /* locked */ , "ssvm server private");
+ if (heap == 0)
+ {
+ clib_unix_warning ("heap alloc");
+ return -1;
+ }
+
+ rnd_size = clib_mem_get_heap_free_space (heap);