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

4.115
Last change on this file since d8134178 was d8134178, checked in by Alex Ivanov <alexivanov97@…>, on 01/09/13 at 16:20:58

score: Doxygen Clean Up Task #18

http://www.google-melange.com/gci/task/view/google/gci2012/8137204

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