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

Function _split_varea

components/mm/mm_aspace.c:941–980  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

939}
940
941static rt_err_t _split_varea(rt_varea_t existed, char *ex_end, char *unmap_start, char *unmap_end, rt_size_t unmap_len)
942{
943 int error;
944 size_t rela_offset;
945 rt_varea_t subset;
946 char *subset_start;
947 size_t subset_size;
948
949 if (existed->mem_obj && existed->mem_obj->on_varea_split)
950 {
951 subset_start = unmap_end;
952 subset_size = ex_end - subset_start;
953 subset = _varea_create(subset_start, subset_size);
954 if (subset)
955 {
956 rela_offset = MM_PA_TO_OFF(subset_start - (char *)existed->start);
957 subset->aspace = existed->aspace;
958 subset->attr = existed->attr;
959 subset->mem_obj = existed->mem_obj;
960 subset->flag = existed->flag & ~MMF_STATIC_ALLOC;
961 subset->offset = existed->offset + rela_offset;
962
963 error = existed->mem_obj->on_varea_split(existed, unmap_start, unmap_len, subset);
964 if (error == RT_EOK)
965 {
966 existed->size = unmap_start - (char *)existed->start;
967 _aspace_bst_insert(existed->aspace, subset);
968 }
969
970 if (error != RT_EOK)
971 rt_free(subset);
972 }
973 else
974 error = -RT_ENOMEM;
975 }
976 else
977 error = -RT_EPERM;
978
979 return error;
980}
981
982/* remove overlapped pages from varea */
983static int _remove_overlapped_varea(rt_varea_t existed, char *unmap_start, rt_size_t unmap_len)

Callers 1

_remove_overlapped_vareaFunction · 0.85

Calls 3

_varea_createFunction · 0.85
rt_freeFunction · 0.85
_aspace_bst_insertFunction · 0.70

Tested by

no test coverage detected