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

Function _find_free

components/mm/mm_aspace.c:1227–1297  ·  view source on GitHub ↗

* Find a memory region that: * - is free * - sits inside the limit range * - meets the alignment requirement */

Source from the content-addressed store, hash-verified

1225 * - meets the alignment requirement
1226 */
1227static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size,
1228 void *limit_start, rt_size_t limit_size,
1229 mm_flag_t flags)
1230{
1231 rt_varea_t varea = NULL;
1232 void *va = RT_NULL;
1233 struct _mm_range limit = {limit_start, (char *)limit_start + limit_size - 1};
1234
1235 rt_ubase_t align_mask = ~0ul;
1236 if (flags & MMF_REQUEST_ALIGN)
1237 {
1238 align_mask = ~((1 << MMF_GET_ALIGN(flags)) - 1);
1239 }
1240
1241 if (flags & MMF_MAP_FIXED)
1242 {
1243 struct _mm_range range = {prefer, (char *)prefer + req_size - 1};
1244
1245 /* caller should guarantee that the request region is legal */
1246 RT_ASSERT(!_not_in_range(flags, prefer, req_size, limit_start, limit_size));
1247
1248 varea = _aspace_bst_search_overlap(aspace, range);
1249 if (!varea)
1250 {
1251 va = prefer;
1252 }
1253 else
1254 {
1255 /* region not freed */
1256 }
1257 }
1258 else if (prefer != RT_NULL)
1259 {
1260 struct _mm_range range;
1261
1262 /* ceiling the prefer address */
1263 prefer = _align(prefer, align_mask);
1264 if (_not_in_range(flags, prefer, req_size, limit_start, limit_size))
1265 {
1266 prefer = limit_start;
1267 }
1268
1269 range.start = prefer;
1270 range.end = (char *)prefer + req_size - 1;
1271 varea = _aspace_bst_search_overlap(aspace, range);
1272
1273 if (!varea)
1274 {
1275 /* if preferred and free, just return the prefer region */
1276 va = prefer;
1277 }
1278 else
1279 {
1280 /* search from `varea` in ascending order */
1281 va = _ascending_search(varea, req_size, align_mask, limit);
1282 if (va == RT_NULL)
1283 {
1284 /* rewind to first range */

Callers 1

_varea_installFunction · 0.85

Calls 5

_not_in_rangeFunction · 0.85
_alignFunction · 0.85
_ascending_searchFunction · 0.85

Tested by

no test coverage detected