diff options
Diffstat (limited to 'arch/x86_64/sys')
| -rw-r--r-- | arch/x86_64/sys/link.c | 69 | ||||
| -rw-r--r-- | arch/x86_64/sys/link.h | 15 |
2 files changed, 69 insertions, 15 deletions
diff --git a/arch/x86_64/sys/link.c b/arch/x86_64/sys/link.c index 96f8eeb..c8b08ec 100644 --- a/arch/x86_64/sys/link.c +++ b/arch/x86_64/sys/link.c @@ -1,19 +1,58 @@ #include "sys/link.h" +#include "api/obj.h" +#include "arch/x86_64/hal/paging.h" +#include "hal/memory.h" +#include "hal/obj.h" +#include "jove.h" +#include "sys/lock.h" -jove_obj_t -link_unlink(jove_owned_obj_t *link) +int link_new(jove_owned_obj_t *target_obj, jove_owned_obj_t *untyped_obj, uint8_t permissions) { - struct obj_link *linkval = obj_deref(link); - if(--linkval->refcount == 1) { - jove_obj_t held_obj = linkval->obj; - link->locked = held_obj; - return (jove_obj_t) { - .lock = 0, - .type = JOVE_OBJ_UNTYPED, - .value = (uintptr_t)linkval - }; - }else{ - obj_settype(link, JOVE_OBJ_NONE); - } - return (jove_obj_t) { 0 }; + jove_untyped_t *untyped = obj_deref(untyped_obj); + if(untyped->limit != sizeof(jove_link_obj_t)) return -EBADSIZE; + + jove_link_obj_t *link = (jove_link_obj_t*)untyped; + release_mutex(&link->lock); + link->permissions = permissions; + link->refcount = 2; + link->obj = target_obj->locked; + + obj_setvalue(target_obj, (uintptr_t)link); + obj_setvalue(untyped_obj, (uintptr_t)link); + + obj_settype(target_obj, JOVE_OBJ_LINK); + obj_settype(untyped_obj, JOVE_OBJ_LINK); + + return 0; +} + +int link_dup(jove_owned_obj_t *link_obj, jove_owned_obj_t *dest_obj) +{ + jove_link_obj_t *link = obj_deref(link_obj); + obj_settype(dest_obj, JOVE_OBJ_LINK); + obj_setvalue(dest_obj, obj_getvalue(link_obj)); + link->refcount++; + return 0; +} + +inline jove_owned_obj_t* +link_deref(jove_link_obj_t *link) +{ + return obj_take(&link->obj); } + +inline jove_owned_obj_t* +link_try_deref(jove_link_obj_t *link) +{ + return obj_trytake(&link->obj); +} + +inline void link_lock(jove_link_obj_t *link) +{ take_mutex(&link->lock); } +inline void link_unlock(jove_link_obj_t *link) +{ release_mutex(&link->lock); } + +inline uint8_t link_getperm(jove_link_obj_t *link) +{ return link->permissions; } +inline void link_setperm(jove_link_obj_t *link, uint8_t perm) +{ link->permissions = perm; } diff --git a/arch/x86_64/sys/link.h b/arch/x86_64/sys/link.h new file mode 100644 index 0000000..e826dc3 --- /dev/null +++ b/arch/x86_64/sys/link.h @@ -0,0 +1,15 @@ +#ifndef _JOVE_ARCH_SYS_LINK_H +#define _JOVE_ARCH_SYS_LINK_H 1 + +#include <stdatomic.h> +#include "hal/obj.h" + +typedef struct link_obj +{ + jove_obj_t obj; + uint32_t refcount; + uint8_t permissions; + atomic_flag lock; +} jove_link_obj_t; + +#endif |
