
- support of in-place growth of vectors (if there is available space next to existing alloc) - drops the need for alloc_aligned_at_offset from memory allocator, which allows easier swap to different memory allocator and reduces malloc overhead - rework of pool and vec macros to inline functions to improve debuggability - fix alignment - in many cases macros were not using native alignment of the particular datatype. Explicitly setting alignment with XXX_aligned() versions of the macro is not needed anymore in > 99% of cases - fix ASAN usage - avoid use of vector of voids, this was root cause of several bugs found in vec_* and pool_* function where sizeof() was used on voids instead of real vector data type - introduce minimal alignment which is currently 8 bytes, vectors will be always aligned at least to that value (underlay allocator actually always provide 16-byte aligned allocs) Type: improvement Change-Id: I20f4b081bb13bbf7bc0ace85cc4e301787f12fdf Signed-off-by: Damjan Marion <damarion@cisco.com>
91 lines
2.2 KiB
C
91 lines
2.2 KiB
C
/*
|
|
*------------------------------------------------------------------
|
|
* svm.h - shared VM allocation, mmap(...MAP_FIXED...)
|
|
* brain police
|
|
*
|
|
* Copyright (c) 2009 Cisco and/or its affiliates.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef __included_svm_h__
|
|
#define __included_svm_h__
|
|
|
|
#include <pthread.h>
|
|
#include <vppinfra/clib.h>
|
|
#include <vppinfra/mem.h>
|
|
#include <svm/svm_common.h>
|
|
|
|
#define MMAP_PAGESIZE (clib_mem_get_page_size())
|
|
|
|
static inline void *
|
|
svm_mem_alloc (svm_region_t * rp, uword size)
|
|
{
|
|
clib_mem_heap_t *oldheap;
|
|
ASSERT (rp->flags & SVM_FLAGS_MHEAP);
|
|
u8 *rv;
|
|
|
|
pthread_mutex_lock (&rp->mutex);
|
|
oldheap = clib_mem_set_heap (rp->data_heap);
|
|
rv = clib_mem_alloc (size);
|
|
clib_mem_set_heap (oldheap);
|
|
pthread_mutex_unlock (&rp->mutex);
|
|
return (rv);
|
|
}
|
|
|
|
static inline void
|
|
svm_mem_free (svm_region_t * rp, void *ptr)
|
|
{
|
|
clib_mem_heap_t *oldheap;
|
|
ASSERT (rp->flags & SVM_FLAGS_MHEAP);
|
|
|
|
pthread_mutex_lock (&rp->mutex);
|
|
oldheap = clib_mem_set_heap (rp->data_heap);
|
|
clib_mem_free (ptr);
|
|
clib_mem_set_heap (oldheap);
|
|
pthread_mutex_unlock (&rp->mutex);
|
|
|
|
}
|
|
|
|
static inline void *
|
|
svm_push_pvt_heap (svm_region_t * rp)
|
|
{
|
|
clib_mem_heap_t *oldheap;
|
|
oldheap = clib_mem_set_heap (rp->region_heap);
|
|
return ((void *) oldheap);
|
|
}
|
|
|
|
static inline void *
|
|
svm_push_data_heap (svm_region_t * rp)
|
|
{
|
|
clib_mem_heap_t *oldheap;
|
|
oldheap = clib_mem_set_heap (rp->data_heap);
|
|
return ((void *) oldheap);
|
|
}
|
|
|
|
static inline void
|
|
svm_pop_heap (void *oldheap)
|
|
{
|
|
clib_mem_set_heap (oldheap);
|
|
}
|
|
|
|
#endif /* __included_svm_h__ */
|
|
|
|
/*
|
|
* fd.io coding-style-patch-verification: ON
|
|
*
|
|
* Local Variables:
|
|
* eval: (c-set-style "gnu")
|
|
* End:
|
|
*/
|