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

Function _next_free_region

components/mm/mm_memblock.c:254–315  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

252}
253
254static void _next_free_region(struct rt_mmblk_reg **m, struct rt_mmblk_reg **r, mmblk_flag_t flags,
255 rt_size_t *out_start, rt_size_t *out_end)
256{
257 /* memory related data */
258 rt_size_t m_start = 0;
259 rt_size_t m_end = 0;
260
261 /* reserved related data */
262 rt_size_t r_start = 0;
263 rt_size_t r_end = 0;
264 struct rt_mmblk_reg *r_sentinel = rt_slist_entry(&(mmblk_reserved.reg_list), struct rt_mmblk_reg, node);
265
266 for (; *m != RT_NULL; *m = _next_region(*m))
267 {
268 if ((*m)->flags != flags)
269 continue;
270
271 m_start = (*m)->memreg.start;
272 m_end = (*m)->memreg.end;
273
274 for (; *r != RT_NULL; *r = _next_region(*r))
275 {
276 /*
277 * r started with _resreg_guard
278 * Find the complement of reserved memblock.
279 * For example, if reserved memblock is following:
280 *
281 * 0:[8-16), 1:[32-48), 2:[128-130)
282 *
283 * The upper 32bit indexes the following regions.
284 *
285 * 0:[0-8), 1:[16-32), 2:[48-128), 3:[130-MAX)
286 *
287 * So we can find intersecting region other than excluding.
288 */
289 r_start = (*r == r_sentinel) ? 0 : (*r)->memreg.end;
290 r_end = (_next_region(*r)) ? _next_region(*r)->memreg.start : PHYS_ADDR_MAX;
291
292 /* two reserved region are adjacent */
293 if (r_start == r_end)
294 continue;
295
296 if (r_start >= m_end)
297 break;
298
299 if (m_start < r_end)
300 {
301 *out_start = MAX(m_start, r_start);
302 *out_end = MIN(m_end, r_end);
303
304 if (m_end <= r_end)
305 *m = _next_region(*m);
306 else
307 *r = _next_region(*r);
308 return;
309 }
310 }
311 }

Callers 1

Calls 1

_next_regionFunction · 0.85

Tested by

no test coverage detected