annotate packages/services/memalloc/common/current/include/sepmetaimpl.inl @ 2808:ef21b86ad6b9

* include/mvarimpl.inl: * include/sepmetaimpl.inl: Fixed a few compiler warnings.
author jlarmour
date Tue, 17 Feb 2009 00:39:42 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
1 #ifndef CYGONCE_MEMALLOC_SEPMETAIMPL_INL
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
2 #define CYGONCE_MEMALLOC_SEPMETAIMPL_INL
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
3
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
4 //==========================================================================
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
5 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
6 // sepmetaimpl.inl
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
7 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
8 // Variable block memory pool with separate metadata class declarations
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
9 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
10 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
11 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
12 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
13 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
15 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
16 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
17 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
18 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
19 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
20 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
21 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
22 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
23 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
24 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
25 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
26 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
27 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
28 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
29 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
30 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
31 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
32 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
33 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
34 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
35 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
36 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
37 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
38 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
39 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
40 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1687
diff changeset
41 // ####ECOSGPLCOPYRIGHTEND####
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
42 //==========================================================================
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
43 //#####DESCRIPTIONBEGIN####
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
44 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
45 // Author(s): jlarmour
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
46 // Contributors: hmt
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
47 // Date: 2001-06-28
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
48 // Purpose: Define Sepmetaimpl class interface
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
49 // Description: Inline class for constructing a variable block allocator
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
50 // with separate metadata.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
51 // Usage: #include <cyg/memalloc/sepmetaimpl.hxx>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
52 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
53 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
54 //####DESCRIPTIONEND####
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
55 //
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
56 //==========================================================================
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
57
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
58 #include <pkgconf/system.h>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
59 #ifdef CYGPKG_ISOINFRA
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
60 # include <pkgconf/isoinfra.h>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
61 #endif
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
62 #include <pkgconf/memalloc.h>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
63 #include <cyg/memalloc/sepmetaimpl.hxx>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
64
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
65 #include <cyg/infra/cyg_ass.h> // assertion support
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
66 #include <cyg/infra/cyg_trac.h> // tracing support
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
67
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
68 // Simple allocator
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
69
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
70 // The memory block lists are doubly linked lists. One for all alloced
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
71 // blocks, one for all free blocks. There's also a list of unused
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
72 // metadata from the metadata pool. The head of the
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
73 // list has the same structure but its memnext/memprev fields are zero.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
74 // Always having at least one item on the list simplifies the alloc and
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
75 // free code.
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 176
diff changeset
76 #ifdef CYGINT_ISO_STRING_MEMFUNCS
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
77 # include <string.h>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
78 #endif
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
79
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
80 inline void
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
81 Cyg_Mempool_Sepmeta_Implementation::copy_data( cyg_uint8 *dst,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
82 cyg_uint8 *src,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
83 cyg_int32 nbytes )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
84 {
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 176
diff changeset
85 #ifdef CYGINT_ISO_STRING_MEMFUNCS
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
86 memmove( dst, src, nbytes );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
87 #else
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
88 if ((src < dst) && (dst < (src + nbytes))) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
89 // Have to copy backwards
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
90 src += nbytes;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
91 dst += nbytes;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
92 while (nbytes--) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
93 *--dst = *--src;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
94 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
95 } else {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
96 while (nbytes--) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
97 *dst++ = *src++;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
98 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
99 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
100 #endif
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
101 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
102
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
103 inline cyg_uint8 *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
104 Cyg_Mempool_Sepmeta_Implementation::alignup( cyg_uint8 *addr )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
105 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
106 return (cyg_uint8 *)((cyg_int32)(addr + alignment-1) & -alignment);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
107 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
108
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
109 inline cyg_uint8 *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
110 Cyg_Mempool_Sepmeta_Implementation::aligndown( cyg_uint8 *addr )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
111 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
112 return (cyg_uint8 *)((cyg_int32)addr & -alignment);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
113 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
114
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
115 inline cyg_uint8 *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
116 Cyg_Mempool_Sepmeta_Implementation::alignmetaup( cyg_uint8 *addr )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
117 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
118 const size_t memdqalign = __alignof__ (struct memdq);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
119 return (cyg_uint8 *)((cyg_int32)(addr + memdqalign-1) & -memdqalign);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
120 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
121
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
122 inline cyg_uint8 *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
123 Cyg_Mempool_Sepmeta_Implementation::alignmetadown( cyg_uint8 *addr )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
124 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
125 const size_t memdqalign = __alignof__ (struct memdq);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
126 return (cyg_uint8 *)((cyg_int32)addr & -memdqalign);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
127 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
128
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
129 // return the alloced dq at mem
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
130 inline struct Cyg_Mempool_Sepmeta_Implementation::memdq *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
131 Cyg_Mempool_Sepmeta_Implementation::find_alloced_dq( cyg_uint8 *mem )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
132 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
133 struct memdq *dq=allocedhead.next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
134
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
135 while (dq->mem != mem ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
136 CYG_ASSERT( dq->next->prev==dq, "Bad link in dq");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
137 CYG_ASSERT( dq->memnext->memprev==dq, "Bad link in mem dq");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
138 if (dq->next == &memend) // address not found!
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
139 return NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
140 dq = dq->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
141 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
142 return dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
143 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
144
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
145 // returns a free dq of at least size, or NULL if none
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
146 inline struct Cyg_Mempool_Sepmeta_Implementation::memdq *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
147 Cyg_Mempool_Sepmeta_Implementation::find_free_dq( cyg_int32 size )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
148 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
149 struct memdq *dq = freehead.next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
150
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
151 while ( (dq->memnext->mem - dq->mem) < size ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
152 CYG_ASSERT( dq->next->prev==dq, "Bad link in dq");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
153 CYG_ASSERT( dq->memnext->memprev==dq, "Bad link in mem dq");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
154 if (dq->next == &freehead) { // reached end of list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
155 return NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
156 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
157 dq = dq->next; // next on free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
158 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
159 return dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
160 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
161
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
162 // returns the free dq following mem
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
163 inline struct Cyg_Mempool_Sepmeta_Implementation::memdq *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
164 Cyg_Mempool_Sepmeta_Implementation::find_free_dq_slot( cyg_uint8 *mem )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
165 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
166 struct memdq *dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
167 for (dq = freehead.next; dq->mem < mem; dq = dq->next) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
168 if ( dq == &freehead ) // wrapped round
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
169 break;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
170 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
171 return dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
172 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
173
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
174 inline void
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
175 Cyg_Mempool_Sepmeta_Implementation::check_free_memdq( struct memdq *dq )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
176 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
177 if (dq == &freehead)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
178 return;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
179 CYG_ASSERT(dq->memnext->memprev == dq, "corrupted free dq #1");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
180 CYG_ASSERT(dq->next->prev == dq, "corrupted free dq #2");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
181 CYG_ASSERT(dq->memprev->memnext == dq, "corrupted free dq #3");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
182 CYG_ASSERT(dq->prev->next == dq, "corrupted free dq #4");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
183 CYG_ASSERT(dq->memnext->mem > dq->mem, "free dq mem not sorted #1");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
184 if (dq->memprev != &memend)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
185 CYG_ASSERT(dq->memprev->mem < dq->mem, "free dq mem not sorted #2");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
186 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
187
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
188 inline void
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
189 Cyg_Mempool_Sepmeta_Implementation::check_alloced_memdq( struct memdq *dq )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
190 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
191 CYG_ASSERT(dq->memnext->memprev == dq, "corrupted alloced dq #1");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
192 CYG_ASSERT(dq->next->prev == dq, "corrupted alloced dq #2");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
193 CYG_ASSERT(dq->memprev->memnext == dq, "corrupted alloced dq #3");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
194 CYG_ASSERT(dq->prev->next == dq, "corrupted alloced dq #4");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
195 if (dq != &memend)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
196 CYG_ASSERT(dq->memnext->mem > dq->mem, "alloced dq mem not sorted #1");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
197 if (dq->memprev != &memhead)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
198 CYG_ASSERT(dq->memprev->mem < dq->mem, "alloced dq mem not sorted #2");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
199 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
200
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
201 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
202
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
203 inline void
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
204 Cyg_Mempool_Sepmeta_Implementation::insert_free_block( struct memdq *dq )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
205 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
206 // scan for correct slot in the sorted free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
207 struct memdq *fdq = find_free_dq_slot( dq->mem );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
208
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
209 CYG_ASSERT(fdq != &freehead ? fdq->mem > dq->mem : 1,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
210 "Block address is already in freelist");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
211
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
212 check_free_memdq(fdq);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
213
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
214 if (dq->memnext == fdq) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
215 // we can coalesce these two together
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
216 // adjust fdq's mem address backwards to include dq
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
217 fdq->mem = dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
218 // and remove dq
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
219 fdq->memprev = dq->memprev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
220 fdq->memprev->memnext = fdq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
221 // Don't need to adjust fdq's next/prev links as it stays in the
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
222 // same place in the free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
223
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
224 // dq is now redundant so return to metadata free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
225 dq->next = freemetahead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
226 freemetahead = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
227
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
228 // reset dq
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
229 dq = fdq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
230 } else {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
231 // insert behind fdq
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
232 dq->next = fdq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
233 dq->prev = fdq->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
234 fdq->prev = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
235 dq->prev->next = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
236 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
237
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
238 check_free_memdq(dq);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
239
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
240 // maybe also coalesce backwards
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
241 if (dq->memprev == dq->prev) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
242 // adjust dq's mem address backwards to include dq->prev
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
243 dq->mem = dq->prev->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
244
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
245 // return dq->prev to metadata free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
246 dq->prev->next = freemetahead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
247 freemetahead = dq->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
248
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
249 // and remove dq->prev from mem list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
250 dq->memprev = dq->prev->memprev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
251 dq->memprev->memnext = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
252 // and free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
253 dq->prev = dq->prev->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
254 dq->prev->next = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
255
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
256 check_free_memdq(dq);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
257 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
258 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
259
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
260 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
261 #include <cyg/infra/diag.h>
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
262 inline
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
263 Cyg_Mempool_Sepmeta_Implementation::Cyg_Mempool_Sepmeta_Implementation(
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
264 cyg_uint8 *base,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
265 cyg_int32 size,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
266 CYG_ADDRWORD consargs)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
267 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
268 CYG_REPORT_FUNCTION();
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
269 struct constructorargs *args = (struct constructorargs *)consargs;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
270 CYG_CHECK_DATA_PTRC( args );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
271
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
272 alignment = args->alignment;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
273
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
274 CYG_ASSERT( alignment > 0, "Bad alignment" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
275 CYG_ASSERT( 0!=alignment, "alignment is zero" );
2808
ef21b86ad6b9 * include/mvarimpl.inl:
jlarmour
parents: 2729
diff changeset
276 CYG_ASSERT( 0==(alignment & (alignment-1)), "alignment not a power of 2" );
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
277
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
278 obase=base;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
279 osize=size;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
280 metabase = args->metabase;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
281 metasize = args->metasize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
282
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
283 // bottom is set to the lowest available address given the alignment.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
284 bottom = alignup( base );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
285 cyg_uint8 *metabottom = alignmetaup( metabase );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
286
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
287 // because we split free blocks by allocating memory from the end, not
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
288 // the beginning, then to preserve alignment, the *top* must also be
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
289 // aligned
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
290 top = aligndown( base+size );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
291 cyg_uint8 *metatop = metabottom +
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
292 sizeof(struct memdq)*(metasize/sizeof(struct memdq));
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
293
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
294 CYG_ASSERT( top > bottom , "heap too small" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
295 CYG_ASSERT( top <= (base+size), "top too large" );
2808
ef21b86ad6b9 * include/mvarimpl.inl:
jlarmour
parents: 2729
diff changeset
296 CYG_ASSERT( (((cyg_int32)(top)) & (alignment-1))==0,
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
297 "top badly aligned" );
2808
ef21b86ad6b9 * include/mvarimpl.inl:
jlarmour
parents: 2729
diff changeset
298 CYG_ASSERT( (((cyg_int32)(bottom)) & (alignment-1))==0,
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
299 "bottom badly aligned" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
300
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
301 CYG_ASSERT( metatop > metabottom , "meta space too small" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
302 CYG_ASSERT( metatop <= (metabase+metasize), "metatop too large" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
303
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
304 // Initialize list of unused metadata blocks. Only need to do next
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
305 // pointers - can ignore prev and size
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
306 struct memdq *fq = freemetahead = (struct memdq *)metabottom;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
307
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
308 while ((cyg_uint8 *)fq < metatop) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
309 fq->next = fq+1;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
310 fq++;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
311 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
312
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
313 CYG_ASSERT((cyg_uint8 *)fq == metatop, "traversed metadata not aligned");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
314
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
315 // set final pointer to NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
316 --fq; fq->next = NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
317
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
318 // initialize the free list. memhead is the initial free block occupying
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
319 // all of free memory.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
320 memhead.next = memhead.prev = &freehead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
321 // The mem list is circular for consistency.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
322 memhead.memprev = memhead.memnext = &memend;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
323 memhead.mem = bottom;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
324
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
325 // initialize block that indicates end of memory. This pretends to
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
326 // be an allocated block
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
327 memend.next = memend.prev = &allocedhead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
328 memend.memnext = memend.memprev = &memhead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
329 memend.mem = top;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
330
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
331 // initialize alloced list memdq. memend pretends to be allocated memory
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
332 // at the end
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
333 allocedhead.next = allocedhead.prev = &memend;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
334 freehead.next = freehead.prev = &memhead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
335 // Since allocedhead and freehead are placeholders, not real blocks,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
336 // assign addresses which can't match list searches
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
337 allocedhead.memnext = allocedhead.memprev = NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
338 freehead.memnext = freehead.memprev = NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
339 freehead.mem = allocedhead.mem = NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
340
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
341 freemem = top - bottom;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
342 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
343
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
344 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
345
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
346 inline
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
347 Cyg_Mempool_Sepmeta_Implementation::~Cyg_Mempool_Sepmeta_Implementation()
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
348 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
349 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
350
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
351 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
352 // allocation is mostly simple
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
353 // First we look down the free list for a large enough block
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
354 // If we find a block the right size, we unlink the block from
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
355 // the free list and return a pointer to it.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
356 // If we find a larger block, we chop a piece off the end
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
357 // and return that
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
358 // Otherwise we reach the end of the list and return NULL
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
359
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
360 inline cyg_uint8 *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
361 Cyg_Mempool_Sepmeta_Implementation::try_alloc( cyg_int32 size )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
362 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
363 struct memdq *alloced;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
364
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
365 CYG_REPORT_FUNCTION();
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
366
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
367 // Allow uninitialised (zero sized) heaps because they could exist as a
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
368 // quirk of the MLT setup where a dynamically sized heap is at the top of
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
369 // memory.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
370 if (NULL == bottom || NULL==metabase)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
371 return NULL;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
372
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
373 size = (size + alignment - 1) & -alignment;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
374
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
375 struct memdq *dq = find_free_dq( size );
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
376
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
377
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
378 if (NULL == dq) {
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
379 CYG_MEMALLOC_FAIL(size);
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
380 return NULL;
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
381 }
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
382
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
383 cyg_int32 dqsize = dq->memnext->mem - dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
384
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
385 if( size == dqsize ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
386 // exact fit -- unlink from free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
387 dq->prev->next = dq->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
388 dq->next->prev = dq->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
389
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
390 // set up this block for insertion into alloced list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
391 dq->next = dq->memnext; // since dq was free, dq->memnext must
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
392 // be allocated otherwise it would have
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
393 // been coalesced
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
394 dq->prev = dq->next->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
395
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
396 alloced = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
397 } else {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
398
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
399 CYG_ASSERT( dqsize > size, "block found is too small");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
400
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
401 // Split into two memdq's, returning the second one
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
402
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
403 // first get a memdq
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
404
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
405 if ( NULL == freemetahead ) {
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
406 // out of metadata.
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
407 CYG_MEMALLOC_FAIL(size);
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
408 return NULL;
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
409 }
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
410
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
411 // FIXME: since we don't search all the way for an exact fit
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
412 // first we may be able to find an exact fit later and therefore
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
413 // not need more metadata. We don't do this yet though.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
414
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
415 alloced = freemetahead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
416 freemetahead = alloced->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
417
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
418 // now set its values
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
419 alloced->memnext = dq->memnext;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
420 alloced->next = dq->memnext; // since dq was free, dq->memnext must
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
421 // be allocated otherwise it would have
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
422 // been coalesced
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
423 alloced->memprev = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
424 alloced->prev = alloced->next->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
425
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
426 alloced->mem = alloced->next->mem - size;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
427
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
428 // now set up dq (the portion that remains a free block)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
429 // dq->next and dq->prev are unchanged as we still end up pointing
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
430 // at the same adjacent free blocks
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
431 // dq->memprev obviously doesn't change
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
432
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
433 dq->memnext = alloced;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
434
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
435 // finish inserting into memory block list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
436 alloced->memnext->memprev = alloced;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
437 alloced->next->prev = alloced->prev->next = alloced;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
438
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
439 check_free_memdq(dq);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
440 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
441
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
442 CYG_ASSERT( bottom <= alloced->mem && alloced->mem <= top,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
443 "alloced outside pool" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
444
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
445 // Insert block into alloced list.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
446 alloced->next->prev = alloced->prev->next = alloced;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
447
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
448 check_alloced_memdq(alloced);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
449
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
450 freemem -=size;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
451
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
452 CYG_ASSERT( ((CYG_ADDRESS)alloced->mem & (alignment-1)) == 0,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
453 "returned memory not aligned" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
454 return alloced->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
455 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
456
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
457 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
458 // resize existing allocation, if oldsize is non-NULL, previous
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
459 // allocation size is placed into it. If previous size not available,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
460 // it is set to 0. NB previous allocation size may have been rounded up.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
461 // Occasionally the allocation can be adjusted *backwards* as well as,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
462 // or instead of forwards, therefore the address of the resized
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
463 // allocation is returned, or NULL if no resizing was possible.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
464 // Note that this differs from ::realloc() in that no attempt is
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
465 // made to call malloc() if resizing is not possible - that is left
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
466 // to higher layers. The data is copied from old to new though.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
467 // The effects of alloc_ptr==NULL or newsize==0 are undefined
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
468
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
469 inline cyg_uint8 *
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
470 Cyg_Mempool_Sepmeta_Implementation::resize_alloc( cyg_uint8 *alloc_ptr,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
471 cyg_int32 newsize,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
472 cyg_int32 *oldsize )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
473 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
474 cyg_int32 currsize, origsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
475
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
476 CYG_REPORT_FUNCTION();
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
477
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
478 CYG_CHECK_DATA_PTRC( alloc_ptr );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
479 if ( NULL != oldsize )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
480 CYG_CHECK_DATA_PTRC( oldsize );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
481
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
482 CYG_ASSERT( (bottom <= alloc_ptr) && (alloc_ptr <= top),
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
483 "alloc_ptr outside pool" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
484
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
485 struct memdq *dq=find_alloced_dq( alloc_ptr );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
486 CYG_ASSERT( dq != NULL, "passed address not previously alloced");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
487
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
488 currsize = origsize = dq->memnext->mem - dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
489 if ( NULL != oldsize )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
490 *oldsize = currsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
491
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
492 if ( newsize > currsize ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
493 cyg_int32 nextmemsize=0, prevmemsize=0;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
494
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
495 // see if we can increase the allocation size. Don't change anything
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
496 // so we don't have to undo it later if it wouldn't fit
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
497 if ( dq->next != dq->memnext ) { // if not equal, memnext must
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
498 // be on free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
499 nextmemsize = dq->memnext->memnext->mem - dq->memnext->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
500 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
501 if ( dq->prev != dq->memprev) { // ditto
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
502 prevmemsize = dq->mem - dq->memprev->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
503 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
504 if (nextmemsize + prevmemsize + currsize < newsize)
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
505 {
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
506 CYG_MEMALLOC_FAIL_TEST(true, newsize);
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
507 return NULL; // can't fit it
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
508 }
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
509
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
510 // expand forwards
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
511 if ( nextmemsize != 0 ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
512 if (nextmemsize <= (newsize - currsize)) { // taking all of it
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
513 struct memdq *fblk = dq->memnext;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
514
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
515 // fix up mem list ptrs
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
516 dq->memnext = fblk->memnext;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
517 dq->memnext->memprev=dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
518 // fix up free list ptrs
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
519 fblk->next->prev = fblk->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
520 fblk->prev->next = fblk->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
521
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
522 // return to meta list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
523 fblk->next = freemetahead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
524 freemetahead = fblk->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
525 currsize += nextmemsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
526 } else { // only needs some
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
527 dq->memnext->mem += (newsize - currsize);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
528 currsize = newsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
529 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
530 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
531
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
532 // expand backwards
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
533 if ( currsize < newsize && prevmemsize != 0 ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
534 cyg_uint8 *oldmem = dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
535
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
536 CYG_ASSERT( prevmemsize >= newsize - currsize,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
537 "miscalculated expansion" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
538 if (prevmemsize == (newsize - currsize)) { // taking all of it
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
539 struct memdq *fblk = dq->memprev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
540
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
541 // fix up mem list ptrs
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
542 dq->memprev = fblk->memprev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
543 dq->memprev->memnext=dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
544 dq->mem = fblk->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
545 // fix up free list ptrs
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
546 fblk->next->prev = fblk->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
547 fblk->prev->next = fblk->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
548
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
549 // return to meta list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
550 fblk->next = freemetahead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
551 freemetahead = fblk->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
552 } else { // only needs some
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
553 dq->mem -= (newsize - currsize);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
554 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
555
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
556 // move data into place
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
557 copy_data( dq->mem, oldmem, origsize );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
558 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
559 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
560
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
561 if (newsize < currsize) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
562 // shrink allocation
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
563
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
564 // easy if the next block is already a free block
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
565 if ( dq->memnext != dq->next ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
566 dq->memnext->mem -= currsize - newsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
567 CYG_ASSERT( dq->memnext->mem > dq->mem,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
568 "moving next block back corruption" );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
569 } else {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
570 // if its already allocated we need to create a new free list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
571 // entry
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
572 if (NULL == freemetahead) {
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
573 CYG_MEMALLOC_FAIL(newsize);
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
574 return NULL; // can't do it
1687
eb235374a7ae 2004-06-24 Oyvind Harboe <oyvind.harboe@zylin.com>
asl
parents: 210
diff changeset
575 }
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
576
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
577 struct memdq *fdq = freemetahead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
578 freemetahead = fdq->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
579
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
580 fdq->memprev = dq;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
581 fdq->memnext = dq->memnext;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
582 fdq->mem = dq->mem + newsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
583
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
584 insert_free_block( fdq );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
585 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
586 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
587
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
588 freemem += origsize - newsize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
589
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
590 return dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
591 } // resize_alloc()
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
592
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
593
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
594 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
595 // When no coalescing is done, free is simply a matter of using the
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
596 // freed memory as an element of the free list linking it in at the
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
597 // start. When coalescing, the free list is sorted
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
598
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
599 inline cyg_bool
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
600 Cyg_Mempool_Sepmeta_Implementation::free( cyg_uint8 *p, cyg_int32 size )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
601 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
602 CYG_REPORT_FUNCTION();
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
603
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
604 CYG_CHECK_DATA_PTRC( p );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
605
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
606 if (!((bottom <= p) && (p <= top)))
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
607 return false;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
608
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
609 struct memdq *dq = find_alloced_dq( p );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
610 if (NULL == dq)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
611 return false;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
612
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
613 if (0 == size)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
614 size = dq->memnext->mem - dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
615 else {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
616 size = (size + alignment - 1) & -alignment;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
617 if( (dq->memnext->mem - dq->mem) != size )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
618 return false;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
619 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
620
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
621 check_alloced_memdq( dq );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
622
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
623 // Remove dq from alloced list
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
624 dq->prev->next = dq->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
625 dq->next->prev = dq->prev;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
626
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
627 insert_free_block( dq );
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
628
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
629 freemem += size;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
630
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
631 return true;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
632 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
633
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
634 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
635
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
636 inline void
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
637 Cyg_Mempool_Sepmeta_Implementation::get_status(
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
638 cyg_mempool_status_flag_t flags,
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
639 Cyg_Mempool_Status &status )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
640 {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
641 CYG_REPORT_FUNCTION();
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
642
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
643 // as quick or quicker to just set it, rather than test flag first
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
644 status.arenabase = obase;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
645 if ( 0 != (flags & CYG_MEMPOOL_STAT_ARENASIZE) )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
646 status.arenasize = top - bottom;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
647 if ( 0 != (flags & CYG_MEMPOOL_STAT_TOTALALLOCATED) )
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
648 status.totalallocated = (top-bottom) - freemem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
649 // as quick or quicker to just set it, rather than test flag first
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
650 status.totalfree = freemem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
651 if ( 0 != (flags & CYG_MEMPOOL_STAT_MAXFREE) ) {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
652 struct memdq *dq = &freehead;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
653 cyg_int32 mf = 0;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
654
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
655 do {
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
656 CYG_ASSERT( dq->next->prev==dq, "Bad link in dq");
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
657 dq = dq->next;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
658 if (dq == &freehead) // wrapped round
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
659 break;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
660 if(dq->memnext->mem - dq->mem > mf)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
661 mf = dq->memnext->mem - dq->mem;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
662 } while(1);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
663 status.maxfree = mf;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
664 }
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
665 // as quick or quicker to just set it, rather than test flag first
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
666 status.origbase = obase;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
667 // as quick or quicker to just set it, rather than test flag first
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
668 status.origsize = osize;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
669
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
670 CYG_REPORT_RETURN();
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
671
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
672 } // get_status()
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
673
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
674
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
675 // -------------------------------------------------------------------------
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
676 #endif // ifndef CYGONCE_MEMALLOC_SEPMETAIMPL_INL
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
diff changeset
677 // EOF sepmetaimpl.inl