diff options
-rw-r--r-- | readme.txt | 2 | ||||
-rw-r--r-- | src/chmempools.c | 38 | ||||
-rw-r--r-- | src/include/mempools.h | 5 |
3 files changed, 34 insertions, 11 deletions
diff --git a/readme.txt b/readme.txt index f3672038c..1fb359a87 100644 --- a/readme.txt +++ b/readme.txt @@ -75,6 +75,8 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process, *** 0.8.2 ***
- FIX: Duplicated sections in the documentation removed.
+- NEW: Added chPoolAllocI() and chPoolFreeI() APIs in order to allow the use
+ of memory pools from interrupt handlers and timer callbacks.
*** 0.8.1 ***
- FIX: Fixed a regression in version 0.8.0, the configuration switch
diff --git a/src/chmempools.c b/src/chmempools.c index ae97648a4..dad37aeb4 100644 --- a/src/chmempools.c +++ b/src/chmempools.c @@ -46,16 +46,28 @@ void chPoolInit(MemoryPool *mp, size_t size) { * @return The pointer to the allocated object.
* @retval NULL if pool is empty.
*/
-void *chPoolAlloc(MemoryPool *mp) {
+void *chPoolAllocI(MemoryPool *mp) {
void *objp;
- chDbgAssert(mp != NULL, "chpools.c, chPoolAlloc()");
-
- chSysLock();
+ chDbgAssert(mp != NULL, "chmempools.c, chPoolAllocI()");
if ((objp = mp->mp_next) != NULL)
mp->mp_next = mp->mp_next->ph_next;
+ return objp;
+}
+
+/**
+ * Allocates an object from a memory pool.
+ * @param mp pointer to a \p MemoryPool structure
+ * @return The pointer to the allocated object.
+ * @retval NULL if pool is empty.
+ */
+void *chPoolAlloc(MemoryPool *mp) {
+ void *objp;
+
+ chSysLock();
+ objp = chPoolAllocI(mp);
chSysUnlock();
return objp;
}
@@ -67,17 +79,27 @@ void *chPoolAlloc(MemoryPool *mp) { * @note the object is assumed to be of the right size for the specified
* memory pool.
*/
-void chPoolFree(MemoryPool *mp, void *objp) {
+void chPoolFreeI(MemoryPool *mp, void *objp) {
struct pool_header *php = objp;
chDbgAssert((mp != NULL) && (objp != NULL),
- "chpools.c, chPoolFree()");
-
- chSysLock();
+ "chmempools.c, chPoolFreeI()");
php->ph_next = mp->mp_next;
mp->mp_next = php;
+}
+/**
+ * Releases (or adds) an object into (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
+ * memory pool.
+ */
+void chPoolFree(MemoryPool *mp, void *objp) {
+
+ chSysLock();
+ chPoolFreeI(mp, objp);
chSysUnlock();
}
diff --git a/src/include/mempools.h b/src/include/mempools.h index 0037bf487..28ddeea35 100644 --- a/src/include/mempools.h +++ b/src/include/mempools.h @@ -43,11 +43,10 @@ typedef struct { extern "C" {
#endif
void chPoolInit(MemoryPool *mp, size_t size);
+ void *chPoolAllocI(MemoryPool *mp);
void *chPoolAlloc(MemoryPool *mp);
+ void chPoolFreeI(MemoryPool *mp, void *objp);
void chPoolFree(MemoryPool *mp, void *objp);
-#ifdef CH_USE_HEAP
- void chPoolRelease(MemoryPool *mp);
-#endif
#ifdef __cplusplus
}
#endif
|