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

Function rt_aspace_anon_ref_dec

components/mm/mm_anon.c:67–110  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

65}
66
67rt_err_t rt_aspace_anon_ref_dec(rt_mem_obj_t aobj)
68{
69 rt_err_t rc;
70 rt_aspace_t aspace;
71 rt_private_ctx_t pctx;
72 long former_reference;
73
74 if (aobj)
75 {
76 pctx = _anon_mobj_to_pctx(aobj);
77 RT_ASSERT(pctx);
78
79 former_reference = rt_atomic_add(_anon_obj_get_reference(aobj), -1);
80 LOG_D("%s(aobj=%p) Cur %ld", __func__, aobj, former_reference - 1);
81 if (pctx->readonly)
82 {
83 if (former_reference - 1 <= pctx->readonly)
84 {
85 void *pgtbl;
86 RT_ASSERT(former_reference - 1 == pctx->readonly);
87 aspace = _anon_obj_get_backup(aobj);
88
89 pctx->readonly = 0;
90 pgtbl = aspace->page_table;
91 rt_aspace_delete(aspace);
92 rt_hw_mmu_pgtbl_delete(pgtbl);
93 }
94 }
95 else if (former_reference < 2)
96 {
97 aspace = _anon_obj_get_backup(aobj);
98 aspace->private_object = RT_NULL;
99
100 rt_free(pctx);
101 }
102 rc = RT_EOK;
103 }
104 else
105 {
106 rc = -RT_EINVAL;
107 }
108
109 return rc;
110}
111
112void rt_varea_pgmgr_insert(rt_varea_t varea, void *page_addr)
113{

Callers 2

rt_aspace_detachFunction · 0.85
_anon_varea_closeFunction · 0.85

Calls 6

_anon_mobj_to_pctxFunction · 0.85
_anon_obj_get_referenceFunction · 0.85
_anon_obj_get_backupFunction · 0.85
rt_aspace_deleteFunction · 0.85
rt_freeFunction · 0.85
rt_hw_mmu_pgtbl_deleteFunction · 0.50

Tested by

no test coverage detected