Mercurial > ecos-v3_0-branch
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 |
| 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 | 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 | 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 | 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 | 376 |
| 377 | |
| 378 if (NULL == dq) { | |
| 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 | 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 | 405 if ( NULL == freemetahead ) { |
| 406 // out of metadata. | |
| 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 | 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 | 505 { |
| 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 | 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 | 572 if (NULL == freemetahead) { |
| 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 | 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 |
