source: rtems/cpukit/score/inline/rtems/score/heap.inl @ 9b4422a2

4.115
Last change on this file since 9b4422a2 was 9b4422a2, checked in by Joel Sherrill <joel.sherrill@…>, on 05/03/12 at 15:09:24

Remove All CVS Id Strings Possible Using a Script

Script does what is expected and tries to do it as
smartly as possible.

+ remove occurrences of two blank comment lines

next to each other after Id string line removed.

+ remove entire comment blocks which only exited to

contain CVS Ids

+ If the processing left a blank line at the top of

a file, it was removed.

  • 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 bool _Heap_Is_aligned(
91  uintptr_t value,
92  uintptr_t alignment
93)
94{
95  return (value % alignment) == 0;
96}
97
98RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
99  uintptr_t value,
100  uintptr_t alignment
101)
102{
103  uintptr_t remainder = value % alignment;
104
105  if ( remainder != 0 ) {
106    return value - remainder + alignment;
107  } else {
108    return value;
109  }
110}
111
112RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
113  uintptr_t value,
114  uintptr_t alignment
115)
116{
117  return value - (value % alignment);
118}
119
120/**
121 * @brief Returns the block which is @a offset away from @a block.
122 */
123RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
124  const Heap_Block *block,
125  uintptr_t offset
126)
127{
128  return (Heap_Block *) ((uintptr_t) block + offset);
129}
130
131RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Prev_block(
132  const Heap_Block *block
133)
134{
135  return (Heap_Block *) ((uintptr_t) block - block->prev_size);
136}
137
138RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
139  const Heap_Block *block
140)
141{
142  return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
143}
144
145RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
146  uintptr_t alloc_begin,
147  uintptr_t page_size
148)
149{
150  return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
151    - HEAP_BLOCK_HEADER_SIZE);
152}
153
154RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
155{
156  return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
157}
158
159RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
160  Heap_Block *block,
161  uintptr_t size
162)
163{
164  uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
165
166  block->size_and_flag = size | flag;
167}
168
169RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
170{
171  return block->size_and_flag & HEAP_PREV_BLOCK_USED;
172}
173
174RTEMS_INLINE_ROUTINE bool _Heap_Is_used(
175  const Heap_Block *block
176)
177{
178  const Heap_Block *const next_block =
179    _Heap_Block_at( block, _Heap_Block_size( block ) );
180
181  return _Heap_Is_prev_used( next_block );
182}
183
184RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
185  const Heap_Block *block
186)
187{
188  return !_Heap_Is_used( block );
189}
190
191RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
192  const Heap_Control *heap,
193  const Heap_Block *block
194)
195{
196  return (uintptr_t) block >= (uintptr_t) heap->first_block
197    && (uintptr_t) block <= (uintptr_t) heap->last_block;
198}
199
200/**
201 * @brief Sets the size of the last block for heap @a heap.
202 *
203 * The next block of the last block will be the first block.  Since the first
204 * block indicates that the previous block is used, this ensures that the last
205 * block appears as used for the _Heap_Is_used() and _Heap_Is_free() functions.
206 *
207 * This feature will be used to terminate the scattered heap area list.  See
208 * also _Heap_Extend().
209 */
210RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
211{
212  _Heap_Block_set_size(
213    heap->last_block,
214    (uintptr_t) heap->first_block - (uintptr_t) heap->last_block
215  );
216}
217
218/**
219 * @brief Returns the size of the allocatable area in bytes.
220 *
221 * This value is an integral multiple of the page size.
222 */
223RTEMS_INLINE_ROUTINE uintptr_t _Heap_Get_size( const Heap_Control *heap )
224{
225  return heap->stats.size;
226}
227
228RTEMS_INLINE_ROUTINE uintptr_t _Heap_Max( uintptr_t a, uintptr_t b )
229{
230  return a > b ? a : b;
231}
232
233RTEMS_INLINE_ROUTINE uintptr_t _Heap_Min( uintptr_t a, uintptr_t b )
234{
235  return a < b ? a : b;
236}
237
238/** @} */
239
240#endif
241/* end of include file */
Note: See TracBrowser for help on using the repository browser.