| 65 | } |
| 66 | |
| 67 | rt_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 | |
| 112 | void rt_varea_pgmgr_insert(rt_varea_t varea, void *page_addr) |
| 113 | { |
no test coverage detected