From 3ae2e8ddb38615434dccd5a6462faae144633d27 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 26 Aug 2008 14:43:09 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@409 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/chmempools.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/chpools.c | 121 ------------------------------------------------------- src/kernel.mk | 2 +- 3 files changed, 122 insertions(+), 122 deletions(-) create mode 100644 src/chmempools.c delete mode 100644 src/chpools.c (limited to 'src') diff --git a/src/chmempools.c b/src/chmempools.c new file mode 100644 index 000000000..5b714a73e --- /dev/null +++ b/src/chmempools.c @@ -0,0 +1,121 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @addtogroup MemoryPools + * @{ + */ + +#include + +#ifdef CH_USE_MEMPOOLS + +#ifndef CH_MEMPOOLS_PROVIDE_SBRK +#include +#else +/* + * Optional internal sbrk() implementation, this code requires the linker to + * provide two symbols: __heap_base__ and __heap_end__ that are the boundaries + * of the free RAM space. + */ +extern char __heap_base__; +extern char __heap_end__; +static char *current = &__heap_base__; + +void *sbrk(ptrdiff_t increment) { + char *cp; + + if (current + increment >= &__heap_end__) + return (void *)-1; + cp = current; + current += increment; + return cp; +} +#endif /* CH_MEMPOOLS_PROVIDE_SBRK */ + +/** + * Initializes a memory pool. + * @param mp pointer to a \p MemoryPool structure + * @param size the size of the objects contained in this memory pool + */ +void chPoolInit(MemoryPool *mp, size_t size) { + + chDbgAssert((mp != NULL) && (size >= sizeof(void *)), + "chpools.c, chPoolFree()"); + + mp->mp_next = NULL; + mp->mp_object_size = size; +} + +/** + * Allocates an object from a memory pool. + * @param mp pointer to a \p MemoryPool structure + * @param allow_growth if \p TRUE then the object is allocated by using + * \p sbrk() in case the memory pool is empty + * @return the pointer to the allocated object or \p NULL if the memory is + * exhausted + */ +void *chPoolAlloc(MemoryPool *mp, bool_t allow_growth) { + void *p; + + chDbgAssert(mp != NULL, "chpools.c, chPoolAlloc()"); + + chSysLock(); + + if (mp->mp_next == NULL) { + if (allow_growth) { + p = sbrk(mp->mp_object_size); + + chSysUnlock(); + if (p != (void *)-1) + return p; + } + return NULL; + } + p = mp->mp_next; + mp->mp_next = mp->mp_next->ph_next; + + chSysUnlock(); + return p; +} + +/** + * Releases (or adds) an object to a memory pool. + * @param mp pointer to a \p MemoryPool structure + * @param objp the pointer to the object to be released or added + * @note the object is assumed to be of the right size for the specified + * buffer. + */ +void chPoolFree(MemoryPool *mp, void *objp) { + struct pool_header *php = objp; + + chDbgAssert((mp != NULL) && (objp != NULL), + "chpools.c, chPoolFree()"); + + chSysLock(); + + php->ph_next = mp->mp_next; + mp->mp_next = php; + + chSysUnlock(); +} + +#endif /* CH_USE_MEMPOOLS */ + +/** @} */ diff --git a/src/chpools.c b/src/chpools.c deleted file mode 100644 index 5b714a73e..000000000 --- a/src/chpools.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @addtogroup MemoryPools - * @{ - */ - -#include - -#ifdef CH_USE_MEMPOOLS - -#ifndef CH_MEMPOOLS_PROVIDE_SBRK -#include -#else -/* - * Optional internal sbrk() implementation, this code requires the linker to - * provide two symbols: __heap_base__ and __heap_end__ that are the boundaries - * of the free RAM space. - */ -extern char __heap_base__; -extern char __heap_end__; -static char *current = &__heap_base__; - -void *sbrk(ptrdiff_t increment) { - char *cp; - - if (current + increment >= &__heap_end__) - return (void *)-1; - cp = current; - current += increment; - return cp; -} -#endif /* CH_MEMPOOLS_PROVIDE_SBRK */ - -/** - * Initializes a memory pool. - * @param mp pointer to a \p MemoryPool structure - * @param size the size of the objects contained in this memory pool - */ -void chPoolInit(MemoryPool *mp, size_t size) { - - chDbgAssert((mp != NULL) && (size >= sizeof(void *)), - "chpools.c, chPoolFree()"); - - mp->mp_next = NULL; - mp->mp_object_size = size; -} - -/** - * Allocates an object from a memory pool. - * @param mp pointer to a \p MemoryPool structure - * @param allow_growth if \p TRUE then the object is allocated by using - * \p sbrk() in case the memory pool is empty - * @return the pointer to the allocated object or \p NULL if the memory is - * exhausted - */ -void *chPoolAlloc(MemoryPool *mp, bool_t allow_growth) { - void *p; - - chDbgAssert(mp != NULL, "chpools.c, chPoolAlloc()"); - - chSysLock(); - - if (mp->mp_next == NULL) { - if (allow_growth) { - p = sbrk(mp->mp_object_size); - - chSysUnlock(); - if (p != (void *)-1) - return p; - } - return NULL; - } - p = mp->mp_next; - mp->mp_next = mp->mp_next->ph_next; - - chSysUnlock(); - return p; -} - -/** - * Releases (or adds) an object to a memory pool. - * @param mp pointer to a \p MemoryPool structure - * @param objp the pointer to the object to be released or added - * @note the object is assumed to be of the right size for the specified - * buffer. - */ -void chPoolFree(MemoryPool *mp, void *objp) { - struct pool_header *php = objp; - - chDbgAssert((mp != NULL) && (objp != NULL), - "chpools.c, chPoolFree()"); - - chSysLock(); - - php->ph_next = mp->mp_next; - mp->mp_next = php; - - chSysUnlock(); -} - -#endif /* CH_USE_MEMPOOLS */ - -/** @} */ diff --git a/src/kernel.mk b/src/kernel.mk index febd8fa9c..1aa60125b 100644 --- a/src/kernel.mk +++ b/src/kernel.mk @@ -6,4 +6,4 @@ KERNSRC = ../../src/chinit.c ../../src/chdebug.c \ ../../src/chsem.c ../../src/chmtx.c \ ../../src/chevents.c ../../src/chmsg.c \ ../../src/chsleep.c ../../src/chqueues.c \ - ../../src/chserial.c ../../src/chpools.c + ../../src/chserial.c ../../src/chmempools.c -- cgit v1.2.3