source: rtems/cpukit/score/inline/rtems/score/heap.inl @ b2a0214

4.115
Last change on this file since b2a0214 was b2a0214, checked in by Sebastian Huber <sebastian.huber@…>, on 06/07/10 at 09:35:01

2010-06-07 Sebastian Huber <sebastian.huber@…>

  • score/include/rtems/score/heap.h: Declare _Heap_Get_first_and_last_block(). Removed Heap_Extend_status. Changed return type of _Heap_Extend() to bool.
  • score/inline/rtems/score/heap.inl: Define _Heap_Set_last_block_size().
  • score/src/heap.c: Define and use _Heap_Get_first_and_last_block().
  • score/src/heapgetinfo.c: Removed assert statements. Do not count the last block. This ensures that all size values are an integral multiple of the page size which is consistent with the other statistics.
  • score/src/heapextend.c: Implemented support for scattered heap areas.
  • score/src/heapwalk.c: Dump also last block. Changes for new first and last block values.
  • ./score/src/pheapextend.c, rtems/src/regionextend.c: Update for _Heap_Extend() changes.
  • 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 *  $Id$
18 */
19
20#ifndef _RTEMS_SCORE_HEAP_H
21# error "Never use <rtems/score/heap.inl> directly; include <rtems/score/heap.h> instead."
22#endif
23
24#ifndef _RTEMS_SCORE_HEAP_INL
25#define _RTEMS_SCORE_HEAP_INL
26
27#include <rtems/score/address.h>
28
29/**
30 * @addtogroup ScoreHeap
31 *
32 * @{
33 */
34
35RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_head( Heap_Control *heap )
36{
37  return &heap->free_list;
38}
39
40RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_tail( Heap_Control *heap )
41{
42  return &heap->free_list;
43}
44
45RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
46{
47  return _Heap_Free_list_head(heap)->next;
48}
49
50RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_last( Heap_Control *heap )
51{
52  return _Heap_Free_list_tail(heap)->prev;
53}
54
55RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
56{
57  Heap_Block *next = block->next;
58  Heap_Block *prev = block->prev;
59
60  prev->next = next;
61  next->prev = prev;
62}
63
64RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
65  Heap_Block *old_block,
66  Heap_Block *new_block
67)
68{
69  Heap_Block *next = old_block->next;
70  Heap_Block *prev = old_block->prev;
71
72  new_block->next = next;
73  new_block->prev = prev;
74
75  next->prev = new_block;
76  prev->next = new_block;
77}
78
79RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
80  Heap_Block *block_before,
81  Heap_Block *new_block
82)
83{
84  Heap_Block *next = block_before->next;
85
86  new_block->next = next;
87  new_block->prev = block_before;
88  block_before->next = new_block;
89  next->prev = new_block;
90}
91
92RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
93  uintptr_t value,
94  uintptr_t alignment
95)
96{
97  return (value % alignment) == 0;
98}
99
100RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
101  uintptr_t value,
102  uintptr_t alignment
103)
104{
105  uintptr_t remainder = value % alignment;
106
107  if ( remainder != 0 ) {
108    return value - remainder + alignment;
109  } else {
110    return value;
111  }
112}
113
114RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
115  uintptr_t value,
116  uintptr_t alignment
117)
118{
119  return value - (value % alignment);
120}
121
122/**
123 * @brief Returns the block which is @a offset away from @a block.
124 */
125RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
126  const Heap_Block *block,
127  uintptr_t offset
128)
129{
130  return (Heap_Block *) ((uintptr_t) block + offset);
131}
132
133RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Prev_block(
134  const Heap_Block *block
135)
136{
137  return (Heap_Block *) ((uintptr_t) block - block->prev_size);
138}
139
140RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
141  const Heap_Block *block
142)
143{
144  return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
145}
146
147RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
148  uintptr_t alloc_begin,
149  uintptr_t page_size
150)
151{
152  return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
153    - HEAP_BLOCK_HEADER_SIZE);
154}
155
156RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
157{
158  return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
159}
160
161RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
162  Heap_Block *block,
163  uintptr_t size
164)
165{
166  uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
167
168  block->size_and_flag = size | flag;
169}
170
171RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
172{
173  return block->size_and_flag & HEAP_PREV_BLOCK_USED;
174}
175
176RTEMS_INLINE_ROUTINE bool _Heap_Is_used(
177  const Heap_Block *block
178)
179{
180  const Heap_Block *const next_block =
181    _Heap_Block_at( block, _Heap_Block_size( block ) );
182
183  return _Heap_Is_prev_used( next_block );
184}
185
186RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
187  const Heap_Block *block
188)
189{
190  return !_Heap_Is_used( block );
191}
192
193RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
194  const Heap_Control *heap,
195  const Heap_Block *block
196)
197{
198  return (uintptr_t) block >= (uintptr_t) heap->first_block
199    && (uintptr_t) block <= (uintptr_t) heap->last_block;
200}
201
202/**
203 * @brief Sets the size of the last block for heap @a heap.
204 *
205 * The next block of the last block will be the first block.  Since the first
206 * block indicates that the previous block is used, this ensures that the last
207 * block appears as used for the _Heap_Is_used() and _Heap_Is_free() functions.
208 *
209 * This feature will be used to terminate the scattered heap area list.  See
210 * also _Heap_Extend().
211 */
212RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
213{
214  _Heap_Block_set_size(
215    heap->last_block,
216    (uintptr_t) heap->first_block - (uintptr_t) heap->last_block
217  );
218}
219
220/**
221 * @brief Returns the size of the allocatable area in bytes.
222 *
223 * This value is an integral multiple of the page size.
224 */
225RTEMS_INLINE_ROUTINE uintptr_t _Heap_Get_size( const Heap_Control *heap )
226{
227  return heap->stats.size;
228}
229
230RTEMS_INLINE_ROUTINE uintptr_t _Heap_Max( uintptr_t a, uintptr_t b )
231{
232  return a > b ? a : b;
233}
234
235RTEMS_INLINE_ROUTINE uintptr_t _Heap_Min( uintptr_t a, uintptr_t b )
236{
237  return a < b ? a : b;
238}
239
240/** @} */
241
242#endif
243/* end of include file */
Note: See TracBrowser for help on using the repository browser.