summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-05-03 21:33:39 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-05-03 21:33:39 +0000
commite746a88b22c99f4ffe808fe2e9fb8816121cd608 (patch)
tree4305f0a400a0aed7e7792f43046c7011cf67f106 /cpukit/score
parent2007-05-03 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-e746a88b22c99f4ffe808fe2e9fb8816121cd608.tar.bz2
2007-05-03 Joel Sherrill <joel@OARcorp.com>
* ChangeLog, libcsupport/src/malloc.c, libcsupport/src/mallocfreespace.c, sapi/include/confdefs.h, score/Makefile.am, score/preinstall.am: malloc never blocks so the Region Manager is quite heavy for implementing this. This patch implements the C Program Heap directly in terms of the new Protected Heap handler. This handler is a direct use of a SuperCore Heap in conjunction with the Allocator Mutex used internally by RTEMS. This saves 3184 bytes on most SPARC test executables. * score/include/rtems/score/protectedheap.h, score/src/pheapallocate.c, score/src/pheapallocatealigned.c, score/src/pheapextend.c, score/src/pheapfree.c, score/src/pheapgetblocksize.c, score/src/pheapgetfreeinfo.c, score/src/pheapgetinfo.c, score/src/pheapinit.c, score/src/pheapresizeblock.c, score/src/pheapwalk.c: New files.
Diffstat (limited to 'cpukit/score')
-rw-r--r--cpukit/score/Makefile.am12
-rw-r--r--cpukit/score/include/rtems/score/protectedheap.h215
-rw-r--r--cpukit/score/preinstall.am4
-rw-r--r--cpukit/score/src/pheapallocate.c31
-rw-r--r--cpukit/score/src/pheapallocatealigned.c31
-rw-r--r--cpukit/score/src/pheapextend.c33
-rw-r--r--cpukit/score/src/pheapfree.c30
-rw-r--r--cpukit/score/src/pheapgetblocksize.c32
-rw-r--r--cpukit/score/src/pheapgetfreeinfo.c28
-rw-r--r--cpukit/score/src/pheapgetinfo.c29
-rw-r--r--cpukit/score/src/pheapinit.c19
-rw-r--r--cpukit/score/src/pheapresizeblock.c35
-rw-r--r--cpukit/score/src/pheapwalk.c31
13 files changed, 527 insertions, 3 deletions
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 53aa6c4243..342244f65c 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -23,7 +23,7 @@ include_rtems_score_HEADERS = include/rtems/score/address.h \
include/rtems/score/corebarrier.h include/rtems/score/coremsg.h \
include/rtems/score/coremutex.h include/rtems/score/corerwlock.h \
include/rtems/score/coresem.h include/rtems/score/corespinlock.h \
- include/rtems/score/heap.h \
+ include/rtems/score/heap.h include/rtems/score/protectedheap.h \
include/rtems/score/interr.h include/rtems/score/isr.h \
include/rtems/score/object.h include/rtems/score/priority.h \
include/rtems/score/stack.h include/rtems/score/states.h \
@@ -100,8 +100,8 @@ libscore_a_SOURCES += src/corespinlock.c src/corespinlockrelease.c \
src/corespinlockwait.c
## HEAP_C_FILES
-libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c src/heapfree.c \
- src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \
+libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \
+ src/heapfree.c src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \
src/heapgetfreeinfo.c src/heapallocatealigned.c \
src/heapresizeblock.c
@@ -116,6 +116,12 @@ libscore_a_SOURCES += src/object.c src/objectallocate.c \
src/objectshrinkinformation.c src/objectgetnoprotection.c \
src/objectidtoname.c
+## PROTECTED_HEAP_C_FILES
+libscore_a_SOURCES += src/pheapallocatealigned.c src/pheapallocate.c \
+ src/pheapextend.c src/pheapfree.c src/pheapgetblocksize.c \
+ src/pheapgetfreeinfo.c src/pheapgetinfo.c src/pheapinit.c \
+ src/pheapresizeblock.c src/pheapwalk.c
+
## THREAD_C_FILES
libscore_a_SOURCES += src/thread.c src/threadchangepriority.c \
src/threadclearstate.c src/threadclose.c src/threadcreateidle.c \
diff --git a/cpukit/score/include/rtems/score/protectedheap.h b/cpukit/score/include/rtems/score/protectedheap.h
new file mode 100644
index 0000000000..b41bc6fcec
--- /dev/null
+++ b/cpukit/score/include/rtems/score/protectedheap.h
@@ -0,0 +1,215 @@
+/**
+ * @file rtems/score/protectedheap.h
+ *
+ * This include file contains the information pertaining to the
+ * Protected Heap Handler.
+ *
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_SCORE_PROTECTED_HEAP_H
+#define _RTEMS_SCORE_PROTECTED_HEAP_H
+
+#include <rtems/score/heap.h>
+#include <rtems/score/apimutex.h>
+
+/**
+ * @defgroup ScoreProtHeap Protected Heap Handler
+ *
+ * This handler encapsulates functionality which provides the foundation
+ * Protected Heap services.
+ *
+ * It is a simple wrapper for the help with the addition of the
+ * allocation mutex being used for protection.
+ */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * This routine initializes @a the_heap record to manage the
+ * contiguous heap of @a size bytes which starts at @a starting_address.
+ * Blocks of memory are allocated from the heap in multiples of
+ * @a page_size byte units. If @a page_size is 0 or is not multiple of
+ * CPU_ALIGNMENT, it's aligned up to the nearest CPU_ALIGNMENT boundary.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] starting_address is the starting address of the memory for
+ * the heap
+ * @param[in] size is the size in bytes of the memory area for the heap
+ * @param[in] page_size is the size in bytes of the allocation unit
+ *
+ * @return This method returns the maximum memory available. If
+ * unsuccessful, 0 will be returned.
+ */
+static inline uint32_t _Protected_heap_Initialize(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t size,
+ uint32_t page_size
+)
+{
+ return _Heap_Initialize( the_heap, starting_address, size, page_size );
+}
+
+/**
+ * This routine grows @a the_heap memory area using the size bytes which
+ * begin at @a starting_address.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] starting_address is the starting address of the memory
+ * to add to the heap
+ * @param[in] size is the size in bytes of the memory area to add
+ * @return a status indicating success or the reason for failure
+ */
+boolean _Protected_heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t size
+);
+
+/**
+ * This function attempts to allocate a block of @a size bytes from
+ * @a the_heap. If insufficient memory is free in @a the_heap to allocate
+ * a block of the requested size, then NULL is returned.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] size is the amount of memory to allocate in bytes
+ * @return NULL if unsuccessful and a pointer to the block if successful
+ */
+void *_Protected_heap_Allocate(
+ Heap_Control *the_heap,
+ size_t size
+);
+
+/**
+ * This function attempts to allocate a memory block of @a size bytes from
+ * @a the_heap so that the start of the user memory is aligned on the
+ * @a alignment boundary. If @a alignment is 0, it is set to CPU_ALIGNMENT.
+ * Any other value of @a alignment is taken "as is", i.e., even odd
+ * alignments are possible.
+ * Returns pointer to the start of the memory block if success, NULL if
+ * failure.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] size is the amount of memory to allocate in bytes
+ * @param[in] alignment the required alignment
+ * @return NULL if unsuccessful and a pointer to the block if successful
+ */
+void *_Protected_heap_Allocate_aligned(
+ Heap_Control *the_heap,
+ size_t size,
+ uint32_t alignment
+);
+
+/**
+ * This function sets @a *size to the size of the block of user memory
+ * which begins at @a starting_address. The size returned in @a *size could
+ * be greater than the size requested for allocation.
+ * Returns TRUE if the @a starting_address is in the heap, and FALSE
+ * otherwise.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] starting_address is the starting address of the user block
+ * to obtain the size of
+ * @param[in] size points to a user area to return the size in
+ * @return TRUE if successfully able to determine the size, FALSE otherwise
+ * @return *size filled in with the size of the user area for this block
+ */
+boolean _Protected_heap_Get_block_size(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t *size
+);
+
+/**
+ * This function tries to resize in place the block that is pointed to by the
+ * @a starting_address to the new @a size.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] starting_address is the starting address of the user block
+ * to be resized
+ * @param[in] size is the new size
+ * @param[in] old_mem_size points to a user area to return the size of the
+ * @return TRUE if successfully able to resize the block,
+ * FALSE if the block can't be resized in place,
+ */
+boolean _Protected_heap_Resize_block(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t size
+);
+
+/**
+ * This routine returns the block of memory which begins
+ * at @a starting_address to @a the_heap. Any coalescing which is
+ * possible with the freeing of this routine is performed.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] start_address is the starting address of the user block
+ * to free
+ * @return TRUE if successfully freed, FALSE otherwise
+ */
+boolean _Protected_heap_Free(
+ Heap_Control *the_heap,
+ void *start_address
+);
+
+/**
+ * This routine walks the heap to verify its integrity.
+ *
+ * @param[in] the_heap is the heap to operate upon
+ * @param[in] source is a user specified integer which may be used to
+ * indicate where in the application this was invoked from
+ * @param[in] do_dump is set to TRUE if errors should be printed
+ * @return TRUE if the test passed fine, FALSE otherwise.
+ */
+boolean _Protected_heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+);
+
+/**
+ * This routine walks the heap and tots up the free and allocated
+ * sizes.
+ *
+ * @param[in] the_heap pointer to heap header
+ * @param[in] the_info pointer to a status information area
+ */
+void _Protected_heap_Get_information(
+ Heap_Control *the_heap,
+ Heap_Information_block *the_info
+);
+
+/**
+ * This heap routine returns information about the free blocks
+ * in the specified heap.
+ *
+ * @param[in] the_heap pointer to heap header.
+ * @param[in] info pointer to the free block information.
+ *
+ * @return free block information filled in.
+ */
+void _Protected_heap_Get_free_information(
+ Heap_Control *the_heap,
+ Heap_Information *info
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
index c82a22b21b..a43bc4da11 100644
--- a/cpukit/score/preinstall.am
+++ b/cpukit/score/preinstall.am
@@ -91,6 +91,10 @@ $(PROJECT_INCLUDE)/rtems/score/heap.h: include/rtems/score/heap.h $(PROJECT_INCL
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/heap.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/heap.h
+$(PROJECT_INCLUDE)/rtems/score/protectedheap.h: include/rtems/score/protectedheap.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/protectedheap.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/protectedheap.h
+
$(PROJECT_INCLUDE)/rtems/score/interr.h: include/rtems/score/interr.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/interr.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/interr.h
diff --git a/cpukit/score/src/pheapallocate.c b/cpukit/score/src/pheapallocate.c
new file mode 100644
index 0000000000..a0841bc653
--- /dev/null
+++ b/cpukit/score/src/pheapallocate.c
@@ -0,0 +1,31 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+void *_Protected_heap_Allocate(
+ Heap_Control *the_heap,
+ size_t size
+)
+{
+ void *p;
+
+ _RTEMS_Lock_allocator();
+ p = _Heap_Allocate( the_heap, size );
+ _RTEMS_Unlock_allocator();
+ return p;
+}
+
diff --git a/cpukit/score/src/pheapallocatealigned.c b/cpukit/score/src/pheapallocatealigned.c
new file mode 100644
index 0000000000..897236f370
--- /dev/null
+++ b/cpukit/score/src/pheapallocatealigned.c
@@ -0,0 +1,31 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+boolean _Protected_heap_Get_block_size(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t *size
+)
+{
+ boolean status;
+
+ _RTEMS_Lock_allocator();
+ status = _Heap_Size_of_user_area( the_heap, starting_address, size );
+ _RTEMS_Unlock_allocator();
+ return status;
+}
diff --git a/cpukit/score/src/pheapextend.c b/cpukit/score/src/pheapextend.c
new file mode 100644
index 0000000000..1d1943747f
--- /dev/null
+++ b/cpukit/score/src/pheapextend.c
@@ -0,0 +1,33 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+boolean _Protected_heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t size
+)
+{
+ Heap_Extend_status status;
+ uint32_t amount_extended;
+
+ _RTEMS_Lock_allocator();
+ status = _Heap_Extend(the_heap, starting_address, size, &amount_extended);
+ _RTEMS_Unlock_allocator();
+ return (status == HEAP_EXTEND_SUCCESSFUL);
+}
+
diff --git a/cpukit/score/src/pheapfree.c b/cpukit/score/src/pheapfree.c
new file mode 100644
index 0000000000..0d5737aac6
--- /dev/null
+++ b/cpukit/score/src/pheapfree.c
@@ -0,0 +1,30 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+boolean _Protected_heap_Free(
+ Heap_Control *the_heap,
+ void *start_address
+)
+{
+ boolean status;
+
+ _RTEMS_Lock_allocator();
+ status = _Heap_Free( the_heap, start_address );
+ _RTEMS_Unlock_allocator();
+ return status;
+}
diff --git a/cpukit/score/src/pheapgetblocksize.c b/cpukit/score/src/pheapgetblocksize.c
new file mode 100644
index 0000000000..1e1706063b
--- /dev/null
+++ b/cpukit/score/src/pheapgetblocksize.c
@@ -0,0 +1,32 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+void *_Protected_heap_Allocate_aligned(
+ Heap_Control *the_heap,
+ size_t size,
+ uint32_t alignment
+)
+{
+ void *p;
+
+ _RTEMS_Lock_allocator();
+ p = _Heap_Allocate_aligned( the_heap, size, alignment );
+ _RTEMS_Unlock_allocator();
+ return p;
+}
+
diff --git a/cpukit/score/src/pheapgetfreeinfo.c b/cpukit/score/src/pheapgetfreeinfo.c
new file mode 100644
index 0000000000..bba8a90b18
--- /dev/null
+++ b/cpukit/score/src/pheapgetfreeinfo.c
@@ -0,0 +1,28 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+void _Protected_heap_Get_free_information(
+ Heap_Control *the_heap,
+ Heap_Information *info
+)
+{
+ _RTEMS_Lock_allocator();
+ _Heap_Get_free_information( the_heap, info );
+ _RTEMS_Unlock_allocator();
+}
+
diff --git a/cpukit/score/src/pheapgetinfo.c b/cpukit/score/src/pheapgetinfo.c
new file mode 100644
index 0000000000..26e15d1d5c
--- /dev/null
+++ b/cpukit/score/src/pheapgetinfo.c
@@ -0,0 +1,29 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+void _Protected_heap_Get_information(
+ Heap_Control *the_heap,
+ Heap_Information_block *the_info
+)
+{
+ Heap_Get_information_status status;
+
+ _RTEMS_Lock_allocator();
+ status = _Heap_Get_information( the_heap, the_info );
+ _RTEMS_Unlock_allocator();
+}
diff --git a/cpukit/score/src/pheapinit.c b/cpukit/score/src/pheapinit.c
new file mode 100644
index 0000000000..1d99fcd5f2
--- /dev/null
+++ b/cpukit/score/src/pheapinit.c
@@ -0,0 +1,19 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+
diff --git a/cpukit/score/src/pheapresizeblock.c b/cpukit/score/src/pheapresizeblock.c
new file mode 100644
index 0000000000..5f9946cb0f
--- /dev/null
+++ b/cpukit/score/src/pheapresizeblock.c
@@ -0,0 +1,35 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+boolean _Protected_heap_Resize_block(
+ Heap_Control *the_heap,
+ void *starting_address,
+ size_t size
+)
+{
+ Heap_Resize_status status;
+ uint32_t old_mem_size;
+ uint32_t avail_mem_size;
+
+ _RTEMS_Lock_allocator();
+ status = _Heap_Resize_block(
+ the_heap, starting_address, size, &old_mem_size, &avail_mem_size );
+ _RTEMS_Unlock_allocator();
+ return (status == HEAP_RESIZE_SUCCESSFUL);
+}
+
diff --git a/cpukit/score/src/pheapwalk.c b/cpukit/score/src/pheapwalk.c
new file mode 100644
index 0000000000..963be088c3
--- /dev/null
+++ b/cpukit/score/src/pheapwalk.c
@@ -0,0 +1,31 @@
+/**
+ * COPYRIGHT (c) 1989-2007.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/protectedheap.h>
+
+boolean _Protected_heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+)
+{
+ boolean status;
+
+ _RTEMS_Lock_allocator();
+ status = _Heap_Walk( the_heap, source, do_dump );
+ _RTEMS_Unlock_allocator();
+ return status;
+}