1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef APR_RMM_H 18#define APR_RMM_H 19/** 20 * @file apr_rmm.h 21 * @brief APR-UTIL Relocatable Memory Management Routines 22 */ 23/** 24 * @defgroup APR_Util_RMM Relocatable Memory Management Routines 25 * @ingroup APR_Util 26 * @{ 27 */ 28 29#include "apr.h" 30#include "apr_pools.h" 31#include "apr_errno.h" 32#include "apu.h" 33#include "apr_anylock.h" 34 35#ifdef __cplusplus 36extern "C" { 37#endif /* __cplusplus */ 38 39/** Structure to access Relocatable, Managed Memory */ 40typedef struct apr_rmm_t apr_rmm_t; 41 42/** Fundamental allocation unit, within a specific apr_rmm_t */ 43typedef apr_size_t apr_rmm_off_t; 44 45/** 46 * Initialize a relocatable memory block to be managed by the apr_rmm API. 47 * @param rmm The relocatable memory block 48 * @param lock An apr_anylock_t of the appropriate type of lock, or NULL 49 * if no locking is required. 50 * @param membuf The block of relocatable memory to be managed 51 * @param memsize The size of relocatable memory block to be managed 52 * @param cont The pool to use for local storage and management 53 * @remark Both @param membuf and @param memsize must be aligned 54 * (for instance using APR_ALIGN_DEFAULT). 55 */ 56APU_DECLARE(apr_status_t) apr_rmm_init(apr_rmm_t **rmm, apr_anylock_t *lock, 57 void *membuf, apr_size_t memsize, 58 apr_pool_t *cont); 59 60/** 61 * Destroy a managed memory block. 62 * @param rmm The relocatable memory block to destroy 63 */ 64APU_DECLARE(apr_status_t) apr_rmm_destroy(apr_rmm_t *rmm); 65 66/** 67 * Attach to a relocatable memory block already managed by the apr_rmm API. 68 * @param rmm The relocatable memory block 69 * @param lock An apr_anylock_t of the appropriate type of lock 70 * @param membuf The block of relocatable memory already under management 71 * @param cont The pool to use for local storage and management 72 */ 73APU_DECLARE(apr_status_t) apr_rmm_attach(apr_rmm_t **rmm, apr_anylock_t *lock, 74 void *membuf, apr_pool_t *cont); 75 76/** 77 * Detach from the managed block of memory. 78 * @param rmm The relocatable memory block to detach from 79 */ 80APU_DECLARE(apr_status_t) apr_rmm_detach(apr_rmm_t *rmm); 81 82/** 83 * Allocate memory from the block of relocatable memory. 84 * @param rmm The relocatable memory block 85 * @param reqsize How much memory to allocate 86 */ 87APU_DECLARE(apr_rmm_off_t) apr_rmm_malloc(apr_rmm_t *rmm, apr_size_t reqsize); 88 89/** 90 * Realloc memory from the block of relocatable memory. 91 * @param rmm The relocatable memory block 92 * @param entity The memory allocation to realloc 93 * @param reqsize The new size 94 */ 95APU_DECLARE(apr_rmm_off_t) apr_rmm_realloc(apr_rmm_t *rmm, void *entity, apr_size_t reqsize); 96 97/** 98 * Allocate memory from the block of relocatable memory and initialize it to zero. 99 * @param rmm The relocatable memory block 100 * @param reqsize How much memory to allocate 101 */ 102APU_DECLARE(apr_rmm_off_t) apr_rmm_calloc(apr_rmm_t *rmm, apr_size_t reqsize); 103 104/** 105 * Free allocation returned by apr_rmm_malloc or apr_rmm_calloc. 106 * @param rmm The relocatable memory block 107 * @param entity The memory allocation to free 108 */ 109APU_DECLARE(apr_status_t) apr_rmm_free(apr_rmm_t *rmm, apr_rmm_off_t entity); 110 111/** 112 * Retrieve the physical address of a relocatable allocation of memory 113 * @param rmm The relocatable memory block 114 * @param entity The memory allocation to free 115 * @return address The address, aligned with APR_ALIGN_DEFAULT. 116 */ 117APU_DECLARE(void *) apr_rmm_addr_get(apr_rmm_t *rmm, apr_rmm_off_t entity); 118 119/** 120 * Compute the offset of a relocatable allocation of memory 121 * @param rmm The relocatable memory block 122 * @param entity The physical address to convert to an offset 123 */ 124APU_DECLARE(apr_rmm_off_t) apr_rmm_offset_get(apr_rmm_t *rmm, void *entity); 125 126/** 127 * Compute the required overallocation of memory needed to fit n allocs 128 * @param n The number of alloc/calloc regions desired 129 */ 130APU_DECLARE(apr_size_t) apr_rmm_overhead_get(int n); 131 132#ifdef __cplusplus 133} 134#endif 135/** @} */ 136#endif /* ! APR_RMM_H */ 137 138