ChibiOS/RT Architecture - Reference Manual - Guides |
00001 /* 00002 ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. 00003 00004 This file is part of ChibiOS/RT. 00005 00006 ChibiOS/RT is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 ChibiOS/RT is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 00019 --- 00020 00021 A special exception to the GPL can be applied should you wish to distribute 00022 a combined work that includes ChibiOS/RT, without being obliged to provide 00023 the source code for any proprietary components. See the file exception.txt 00024 for full details of how and when the exception can be applied. 00025 */ 00026 00027 /** 00028 * @file chmempools.c 00029 * @brief Memory Pools code. 00030 * 00031 * @addtogroup pools 00032 * @details Memory Pools related APIs and services. 00033 * <h2>Operation mode</h2> 00034 * The Memory Pools APIs allow to allocate/free fixed size objects in 00035 * <b>constant time</b> and reliably without memory fragmentation 00036 * problems.<br> 00037 * In order to use the memory pools APIs the @p CH_USE_MEMPOOLS option 00038 * must be enabled in @p chconf.h. 00039 * @{ 00040 */ 00041 00042 #include "ch.h" 00043 00044 #if CH_USE_MEMPOOLS 00045 /** 00046 * @brief Initializes an empty memory pool. 00047 * @note The size is internally aligned to be a multiple of the @p align_t 00048 * type size. 00049 * 00050 * @param[out] mp pointer to a @p MemoryPool structure 00051 * @param[in] size the size of the objects contained in this memory pool, 00052 * the minimum accepted size is the size of a pointer to 00053 * void. 00054 * @param[in] provider memory provider function for the memory pool or 00055 * @p NULL if the pool is not allowed to grow 00056 * automatically 00057 */ 00058 void chPoolInit(MemoryPool *mp, size_t size, memgetfunc_t provider) { 00059 00060 chDbgCheck((mp != NULL) && (size >= sizeof(void *)), "chPoolInit"); 00061 00062 mp->mp_next = NULL; 00063 mp->mp_object_size = MEM_ALIGN_SIZE(size); 00064 mp->mp_provider = provider; 00065 } 00066 00067 /** 00068 * @brief Allocates an object from a memory pool. 00069 * 00070 * @param[in] mp pointer to a @p MemoryPool structure 00071 * @return The pointer to the allocated object. 00072 * @retval NULL if pool is empty. 00073 */ 00074 void *chPoolAllocI(MemoryPool *mp) { 00075 void *objp; 00076 00077 chDbgCheck(mp != NULL, "chPoolAllocI"); 00078 00079 if ((objp = mp->mp_next) != NULL) 00080 mp->mp_next = mp->mp_next->ph_next; 00081 #if CH_USE_MEMCORE 00082 else if (mp->mp_provider != NULL) 00083 objp = mp->mp_provider(mp->mp_object_size); 00084 #endif 00085 return objp; 00086 } 00087 00088 /** 00089 * @brief Allocates an object from a memory pool. 00090 * 00091 * @param[in] mp pointer to a @p MemoryPool structure 00092 * @return The pointer to the allocated object. 00093 * @retval NULL if pool is empty. 00094 */ 00095 void *chPoolAlloc(MemoryPool *mp) { 00096 void *objp; 00097 00098 chSysLock(); 00099 objp = chPoolAllocI(mp); 00100 chSysUnlock(); 00101 return objp; 00102 } 00103 00104 /** 00105 * @brief Releases (or adds) an object into (to) a memory pool. 00106 * @note The object is assumed to be of the right size for the specified 00107 * memory pool. 00108 * @note The object is assumed to be memory aligned to the size of @p align_t 00109 * type. 00110 * 00111 * @param[in] mp pointer to a @p MemoryPool structure 00112 * @param[in] objp the pointer to the object to be released or added 00113 */ 00114 void chPoolFreeI(MemoryPool *mp, void *objp) { 00115 struct pool_header *php = objp; 00116 00117 chDbgCheck((mp != NULL) && (objp != NULL) && MEM_IS_ALIGNED(objp), 00118 "chPoolFreeI"); 00119 00120 php->ph_next = mp->mp_next; 00121 mp->mp_next = php; 00122 } 00123 00124 /** 00125 * @brief Releases (or adds) an object into (to) a memory pool. 00126 * @note The object is assumed to be of the right size for the specified 00127 * memory pool. 00128 * 00129 * @param[in] mp pointer to a @p MemoryPool structure 00130 * @param[in] objp the pointer to the object to be released or added 00131 */ 00132 void chPoolFree(MemoryPool *mp, void *objp) { 00133 00134 chSysLock(); 00135 chPoolFreeI(mp, objp); 00136 chSysUnlock(); 00137 } 00138 #endif /* CH_USE_MEMPOOLS */ 00139 00140 /** @} */