diff options
Diffstat (limited to 'sys/link.c')
| -rw-r--r-- | sys/link.c | 56 |
1 files changed, 39 insertions, 17 deletions
@@ -2,31 +2,23 @@ #include "arch/x86_64/hal/obj.h" #include "hal/memory.h" -void* -obj_deref_linked(jove_owned_obj_t *obj) +uint8_t +link_gettype(jove_owned_obj_t *obj) { - switch(obj_gettype(obj)) { - case JOVE_OBJ_LINK: return obj_deref_linked(link_deref(obj)); - default: return obj_deref(obj); - } + return obj_gettype(link_deref(obj)); } uint8_t -obj_gettype_linked(jove_owned_obj_t *obj) +link_getperm(jove_owned_obj_t *link) { - switch(obj_gettype(obj)) { - case JOVE_OBJ_LINK: return obj_gettype_linked(link_deref(obj)); - default: return obj_gettype(obj); - } + struct obj_link *linkval = obj_deref(link); + return linkval->permissions; } uint64_t -obj_getvalue_linked(jove_owned_obj_t *obj) +link_getvalue(jove_owned_obj_t *obj) { - switch(obj_gettype(obj)) { - case JOVE_OBJ_LINK: return obj_getvalue_linked(link_deref(obj)); - default: return obj_getvalue(obj); - } + return obj_getvalue(link_deref(obj)); } jove_owned_obj_t* @@ -36,11 +28,41 @@ link_deref(jove_owned_obj_t *link) return obj_take(&linkval->obj); } -jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst) +jove_owned_obj_t* +link_try_deref(jove_owned_obj_t *link) +{ + struct obj_link *linkval = obj_deref(link); + return obj_trytake(&linkval->obj); +} + +jove_perm_obj_t +link_traverse(jove_owned_obj_t *link, lockstack_t *lockstack) +{ + jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL }; + while(obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) { + perm_obj.permissions &= link_getperm(perm_obj.obj); + perm_obj.obj = lockstack_push(lockstack, link_deref(perm_obj.obj)); + } + return perm_obj; +} + +jove_perm_obj_t +link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack) +{ + jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL }; + while(perm_obj.obj != NULL && obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) { + perm_obj.permissions &= link_getperm(perm_obj.obj); + perm_obj.obj = lockstack_push(lockstack, link_deref(perm_obj.obj)); + } + return perm_obj; +} + +jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst, uint16_t permissions) { struct obj_link *linkval = obj_deref(dst); linkval->obj = *tgt; linkval->refcount = 2; + linkval->permissions = permissions; { jove_owned_obj_t *tgt_owned = obj_take(tgt); |
