source: rtems/cpukit/score/inline/rtems/score/heap.inl @ 47a3cd8

4.115
Last change on this file since 47a3cd8 was 47a3cd8, checked in by Sebastian Huber <sebastian.huber@…>, on 08/09/12 at 14:48:00

score: Work area initialization API change

The work areas (RTEMS work space and C program heap) will be initialized
now in a separate step and are no longer part of
rtems_initialize_data_structures(). Initialization is performed with
tables of Heap_Area entries. This allows usage of scattered memory
areas present on various small scale micro-controllers.

The sbrk() support API changes also. The bsp_sbrk_init() must now deal
with a minimum size for the first memory chunk to take the configured
work space size into account.

  • Property mode set to 100644
File size: 5.0 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup ScoreHeap
5 *
6 * @brief Heap Handler API.
7 */
8
9/*
10 *  COPYRIGHT (c) 1989-2008.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.rtems.com/license/LICENSE.
16 */
17
18#ifndef _RTEMS_SCORE_HEAP_H
19# error "Never use <rtems/score/heap.inl> directly; include <rtems/score/heap.h> instead."
20#endif
21
22#ifndef _RTEMS_SCORE_HEAP_INL
23#define _RTEMS_SCORE_HEAP_INL
24
25#include <rtems/score/address.h>
26
27/**
28 * @addtogroup ScoreHeap
29 *
30 * @{
31 */
32
33RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_head( Heap_Control *heap )
34{
35  return &heap->free_list;
36}
37
38RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_tail( Heap_Control *heap )
39{
40  return &heap->free_list;
41}
42
43RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
44{
45  return _Heap_Free_list_head(heap)->next;
46}
47
48RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_last( Heap_Control *heap )
49{
50  return _Heap_Free_list_tail(heap)->prev;
51}
52
53RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
54{
55  Heap_Block *next = block->next;
56  Heap_Block *prev = block->prev;
57
58  prev->next = next;
59  next->prev = prev;
60}
61
62RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
63  Heap_Block *old_block,
64  Heap_Block *new_block
65)
66{
67  Heap_Block *next = old_block->next;
68  Heap_Block *prev = old_block->prev;
69
70  new_block->next = next;
71  new_block->prev = prev;
72
73  next->prev = new_block;
74  prev->next = new_block;
75}
76
77RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
78  Heap_Block *block_before,
79  Heap_Block *new_block
80)
81{
82  Heap_Block *next = block_before->next;
83
84  new_block->next = next;
85  new_block->prev = block_before;
86  block_before->next = new_block;
87  next->prev = new_block;
88}
89
90RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_before(
91  Heap_Block *block_next,
92  Heap_Block *new_block
93)
94{
95  Heap_Block *prev = block_next->prev;
96
97  new_block->next = block_next;
98  new_block->prev = prev;
99  prev->next = new_block;
100  block_next->prev = new_block;
101}
102
103RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
104  uintptr_t value,
105  uintptr_t alignment
106)
107{
108  return (value % alignment) == 0;
109}
110
111RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
112  uintptr_t value,
113  uintptr_t alignment
114)
115{
116  return value - (value % alignment);
117}
118
119/**
120 * @brief Returns the block which is @a offset away from @a block.
121 */
122RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
123  const Heap_Block *block,
124  uintptr_t offset
125)
126{
127  return (Heap_Block *) ((uintptr_t) block + offset);
128}
129
130RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Prev_block(
131  const Heap_Block *block
132)
133{
134  return (Heap_Block *) ((uintptr_t) block - block->prev_size);
135}
136
137RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
138  const Heap_Block *block
139)
140{
141  return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
142}
143
144RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
145  uintptr_t alloc_begin,
146  uintptr_t page_size
147)
148{
149  return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
150    - HEAP_BLOCK_HEADER_SIZE);
151}
152
153RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
154{
155  return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
156}
157
158RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
159  Heap_Block *block,
160  uintptr_t size
161)
162{
163  uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
164
165  block->size_and_flag = size | flag;
166}
167
168RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
169{
170  return block->size_and_flag & HEAP_PREV_BLOCK_USED;
171}
172
173RTEMS_INLINE_ROUTINE bool _Heap_Is_used(
174  const Heap_Block *block
175)
176{
177  const Heap_Block *const next_block =
178    _Heap_Block_at( block, _Heap_Block_size( block ) );
179
180  return _Heap_Is_prev_used( next_block );
181}
182
183RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
184  const Heap_Block *block
185)
186{
187  return !_Heap_Is_used( block );
188}
189
190RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
191  const Heap_Control *heap,
192  const Heap_Block *block
193)
194{
195  return (uintptr_t) block >= (uintptr_t) heap->first_block
196    && (uintptr_t) block <= (uintptr_t) heap->last_block;
197}
198
199/**
200 * @brief Sets the size of the last block for heap @a heap.
201 *
202 * The next block of the last block will be the first block.  Since the first
203 * block indicates that the previous block is used, this ensures that the last
204 * block appears as used for the _Heap_Is_used() and _Heap_Is_free() functions.
205 *
206 * This feature will be used to terminate the scattered heap area list.  See
207 * also _Heap_Extend().
208 */
209RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
210{
211  _Heap_Block_set_size(
212    heap->last_block,
213    (uintptr_t) heap->first_block - (uintptr_t) heap->last_block
214  );
215}
216
217/**
218 * @brief Returns the size of the allocatable area in bytes.
219 *
220 * This value is an integral multiple of the page size.
221 */
222RTEMS_INLINE_ROUTINE uintptr_t _Heap_Get_size( const Heap_Control *heap )
223{
224  return heap->stats.size;
225}
226
227RTEMS_INLINE_ROUTINE uintptr_t _Heap_Max( uintptr_t a, uintptr_t b )
228{
229  return a > b ? a : b;
230}
231
232RTEMS_INLINE_ROUTINE uintptr_t _Heap_Min( uintptr_t a, uintptr_t b )
233{
234  return a < b ? a : b;
235}
236
237/** @} */
238
239#endif
240/* end of include file */
Note: See TracBrowser for help on using the repository browser.