aboutsummaryrefslogtreecommitdiffstats
path: root/src/chmempools.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-08-28 13:34:46 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-08-28 13:34:46 +0000
commit7768c51b7b1ef0becc4090705a9bd2f14aa28d00 (patch)
treef03950876677269ffd9bda76b4df4bb6cbbe5e5e /src/chmempools.c
parentc1b95a7182aa0884133b3e12477d7cb7fb97ee63 (diff)
downloadChibiOS-7768c51b7b1ef0becc4090705a9bd2f14aa28d00.tar.gz
ChibiOS-7768c51b7b1ef0becc4090705a9bd2f14aa28d00.tar.bz2
ChibiOS-7768c51b7b1ef0becc4090705a9bd2f14aa28d00.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@412 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'src/chmempools.c')
-rw-r--r--src/chmempools.c48
1 files changed, 20 insertions, 28 deletions
diff --git a/src/chmempools.c b/src/chmempools.c
index 5b714a73e..49020d9b2 100644
--- a/src/chmempools.c
+++ b/src/chmempools.c
@@ -26,29 +26,6 @@
#ifdef CH_USE_MEMPOOLS
-#ifndef CH_MEMPOOLS_PROVIDE_SBRK
-#include <unistd.h>
-#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
@@ -67,7 +44,7 @@ void chPoolInit(MemoryPool *mp, size_t 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
+ * \p chHeapAlloc() in case the memory pool is empty
* @return the pointer to the allocated object or \p NULL if the memory is
* exhausted
*/
@@ -79,13 +56,13 @@ void *chPoolAlloc(MemoryPool *mp, bool_t allow_growth) {
chSysLock();
if (mp->mp_next == NULL) {
+#ifdef CH_USE_HEAP
if (allow_growth) {
- p = sbrk(mp->mp_object_size);
chSysUnlock();
- if (p != (void *)-1)
- return p;
+ return chHeapAlloc(mp->mp_object_size);
}
+#endif /* CH_USE_HEAP */
return NULL;
}
p = mp->mp_next;
@@ -96,7 +73,7 @@ void *chPoolAlloc(MemoryPool *mp, bool_t allow_growth) {
}
/**
- * Releases (or adds) an object to a memory pool.
+ * Releases (or adds) an object into 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
@@ -116,6 +93,21 @@ void chPoolFree(MemoryPool *mp, void *objp) {
chSysUnlock();
}
+#ifdef CH_USE_HEAP
+/**
+ * Releases all the objects contained into a pool.
+ * @param mp pointer to a \p MemoryPool structure
+ * @note It is assumed that all the object are allocated using the heap
+ * allocator, do not use this function if the pool contains other kind
+ * of objects.
+ */
+void chPoolRelease(MemoryPool *mp) {
+
+ while (mp->mp_next)
+ chHeapFree(mp->mp_next);
+}
+#endif
+
#endif /* CH_USE_MEMPOOLS */
/** @} */