MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / _memblock_separate_range

Function _memblock_separate_range

components/mm/mm_memblock.c:179–241  ·  view source on GitHub ↗

[*start_reg, *end_reg) is the isolated range */

Source from the content-addressed store, hash-verified

177
178/* [*start_reg, *end_reg) is the isolated range */
179static rt_err_t _memblock_separate_range(struct rt_memblock *memblock,
180 rt_size_t start, rt_size_t end,
181 struct rt_mmblk_reg **start_reg, struct rt_mmblk_reg **end_reg)
182{
183 struct rt_mmblk_reg *reg = RT_NULL;
184 rt_region_t new_region;
185 rt_err_t err = RT_EOK;
186
187 *start_reg = *end_reg = RT_NULL;
188
189 rt_slist_for_each_entry(reg, &(memblock->reg_list), node)
190 {
191 rt_size_t rstart = reg->memreg.start;
192 rt_size_t rend = reg->memreg.end;
193
194 if (rstart >= end)
195 break;
196 if (rend <= start)
197 continue;
198
199 /* the beginning of the range separates its respective region */
200 if (rstart < start)
201 {
202 new_region.start = start;
203 new_region.end = rend;
204 new_region.name = reg->memreg.name;
205 err = _reg_insert_after(reg, &new_region, reg->flags);
206
207 if (err != RT_EOK)
208 return err;
209
210 reg->memreg.end = start;
211
212 *start_reg = _next_region(reg);
213 *end_reg = _next_region(*start_reg);
214 }
215 /* the endpoint of the range separates its respective region */
216 else if (rend > end)
217 {
218 new_region.start = end;
219 new_region.end = rend;
220 new_region.name = reg->memreg.name;
221 err = _reg_insert_after(reg, &new_region, reg->flags);
222
223 if (err != RT_EOK)
224 return err;
225
226 reg->memreg.end = end;
227
228 *end_reg = _next_region(reg);
229 break;
230 }
231 /* reg->next is fully contained in range */
232 else
233 {
234 if (!*end_reg)
235 *start_reg = reg;
236 *end_reg = _next_region(reg);

Callers 1

Calls 2

_reg_insert_afterFunction · 0.85
_next_regionFunction · 0.85

Tested by

no test coverage detected