annotate packages/kernel/current/include/mvarimpl.inl @ 16:4f2df4ab82c8 ecos-sw-1999-06-18

Merge from eCos master repository on 1999-06-18-15:25:04-BST
author jlarmour
date Fri, 18 Jun 1999 07:59:09 +0000
parents 443894e2e912
children c38311975d4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 #ifndef CYGONCE_KERNEL_MVARIMPL_INL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_KERNEL_MVARIMPL_INL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
6 // mvarimpl.inl
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
8 // Memory pool with variable block class declarations
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 //####COPYRIGHTBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
14 // The contents of this file are subject to the Cygnus eCos Public License
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
15 // Version 1.0 (the "License"); you may not use this file except in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
16 // compliance with the License. You may obtain a copy of the License at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 // http://sourceware.cygnus.com/ecos
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 // Software distributed under the License is distributed on an "AS IS"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 // License for the specific language governing rights and limitations under
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 // the License.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 // The Original Code is eCos - Embedded Cygnus Operating System, released
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 // September 30, 1998.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 // The Initial Developer of the Original Code is Cygnus. Portions created
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
28 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
35 // Author(s): hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
36 // Contributors: hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
37 // Date: 1998-03-23
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
38 // Purpose: Define Mvarimpl class interface
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
39 // Description: Inline class for constructing a variable block allocator
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
40 // Usage: #include <cyg/kernel/mvarimpl.hxx>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
41 // #include <cyg/kernel/mvarimpl.inl>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 // Simple non-coalescing allocator
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 // The free list is stored on a doubly linked list, each member of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 // which is stored in the body of the free memory. The head of the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 // list has the same structure but its size field is zero. This
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 // resides in the memory pool structure. Always having at least one
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 // item on the list simplifies the alloc and free code.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 inline cyg_int32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 Cyg_Mempool_Variable_Implementation::roundup( cyg_int32 size )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 size += sizeof(struct memdq);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 size = (size + alignment - 1) & -alignment;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 return size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 Cyg_Mempool_Variable_Implementation::Cyg_Mempool_Variable_Implementation(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 cyg_uint8 *base,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 cyg_int32 size,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 CYG_ADDRWORD align )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 CYG_ASSERT( align > 0, "Bad alignment" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 CYG_ASSERT( size > 0, "Bad size" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 CYG_ASSERT(0!=align ,"align is zero");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 CYG_ASSERT(0==(align & align-1),"align not a power of 2");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 obase=base;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 osize=size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 oalign=align;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 alignment = align;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 while(alignment < (cyg_int32)sizeof(struct memdq))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 alignment += alignment;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 CYG_ASSERT(0==(alignment & alignment-1),"alignment not a power of 2");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 bottom = (cyg_uint8 *)roundup((cyg_int32)base);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 top = (cyg_uint8 *)((cyg_int32)(base+size) & -alignment);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 CYG_ASSERT( top > bottom , "heap too small" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 CYG_ASSERT( ((cyg_int32)bottom & alignment-1)==0, "bottom badly aligned" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 CYG_ASSERT( ((cyg_int32)top & alignment-1)==0, "top badly aligned" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 struct memdq *hdq = &head, *dq = (struct memdq *)bottom;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 hdq->prev = hdq->next = dq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 hdq->size = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 dq->prev = dq->next = hdq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 freemem = dq->size = top-bottom;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 Cyg_Mempool_Variable_Implementation::~Cyg_Mempool_Variable_Implementation()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 // allocation is simple
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 // First we look down the free list for a large enough block
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 // If we find a block the right size, we unlink the block from
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 // the free list and return a pointer to it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 // If we find a larger block, we chop a piece off the end
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 // and return that
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 // Otherwise we will eventually get back to the head of the list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 // and return NULL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 inline cyg_uint8 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 Cyg_Mempool_Variable_Implementation::alloc( cyg_int32 size )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 struct memdq *dq = &head;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 cyg_uint8 *alloced;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 size = roundup(size);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 CYG_ASSERT( dq->next->prev==dq, "Bad link in dq");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 dq = dq->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 if(0 == dq->size) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 CYG_ASSERT(dq == &head, "bad free block");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 return NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 } while(dq->size < size);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 if( size == dq->size ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 // exact fit -- unlink from free list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 dq->prev->next = dq->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 dq->next->prev = dq->prev;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 alloced = (cyg_uint8 *)dq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 } else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 CYG_ASSERT( dq->size > size, "block found is too small");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 // allocate portion of memory from end of block
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 dq->size -=size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 // The portion left over has to be large enough to store a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 // struct memdq. This is guaranteed because the alignment is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 // larger than the size of this structure.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 CYG_ASSERT( (cyg_int32)sizeof(struct memdq)<=dq->size ,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 "not enough space for list item" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 alloced = (cyg_uint8 *)dq + dq->size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 CYG_ASSERT( bottom<=alloced && alloced<=top, "alloced outside pool" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 // Set size on allocated block
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 dq = (struct memdq *)alloced;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157 dq->size = size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 dq->next = dq->prev = (struct memdq *)0xd530d53; // magic number
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 freemem -=size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161 return alloced + sizeof(struct memdq);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 // As no coalescing is done, free is simply a matter of using the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 // freed memory as an element of the free list linking it in at the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 // start.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 inline cyg_bool
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 Cyg_Mempool_Variable_Implementation::free( cyg_uint8 *p, cyg_int32 size )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 if(!(bottom<=p&&p<=top))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 struct memdq *hdq=&head,*dq=(struct memdq *)(p-sizeof(struct memdq));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 // check magic number in block to be freed
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 if(dq->next != dq->prev || dq->next != (struct memdq *)0xd530d53)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 if(0==size) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 size = dq->size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 } else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 size = roundup(size);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 if(dq->size != size)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 CYG_ASSERT( (cyg_int32)sizeof(struct memdq)<=size ,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 "not enough space for list item" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 #ifdef CYGSEM_KERNEL_MEMORY_COALESCE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 // For simple coalescing have the free list be sorted by memory base address
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 struct memdq *idq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 for (idq = hdq->next; idq != hdq; idq = idq->next) {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
197 if (idq->next > dq)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
198 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 dq->size = size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 if (idq != hdq) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 dq->prev = idq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 dq->next = idq->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204 idq->next = dq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 dq->next->prev = dq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 } else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 dq->next = idq;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
208 dq->prev = idq->prev;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
209 idq->prev = dq;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
210 dq->prev->next = dq;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 // Now do coalescing
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 if ((char *)dq + dq->size == (char *)dq->next) {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
214 dq->size += dq->next->size;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 dq->next = dq->next->next;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
216 dq->next->prev = dq;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 if ((char *)dq->prev + dq->prev->size == (char *)dq) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 dq->prev->size += dq->size;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
220 dq->prev->next = dq->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
221 dq->next->prev = dq->prev;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
222 dq = dq->prev;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 dq->prev = hdq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 dq->next = hdq->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 dq->size = size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 hdq->next = dq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 dq->next->prev=dq;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 freemem +=size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
236
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237 inline void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238 Cyg_Mempool_Variable_Implementation::get_arena(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 cyg_uint8 * &base,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240 cyg_int32 &size,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 CYG_ADDRWORD &maxfree)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
242 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243 struct memdq *dq = &head;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244 cyg_int32 mf = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 CYG_ASSERT( dq->next->prev==dq, "Bad link in dq");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 dq = dq->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 if(0 == dq->size) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250 CYG_ASSERT(dq == &head, "bad free block");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 if(dq->size > mf)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 mf = dq->size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255 } while(1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 base = obase;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 size = osize;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 maxfree = mf;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 inline cyg_int32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 Cyg_Mempool_Variable_Implementation::get_allocation_size( cyg_uint8 *ptr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 CYG_CHECK_DATA_PTR(ptr, "Requested allocation size of bad data pointer!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 if(!(bottom<=ptr && ptr<=top))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 struct memdq *dq=(struct memdq *)(ptr-sizeof(struct memdq));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 // check magic number in block to be freed
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 if(dq->next != dq->prev || dq->next != (struct memdq *)0xd530d53)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 return dq->size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279 } // get_allocation_size()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 #endif // ifndef CYGONCE_KERNEL_MVARIMPL_INL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 // EOF mvarimpl.inl