#include "obj.h" #include "arch/x86_64/lock.h" #include "paging.h" #include "hal/obj.h" #include "jove.h" #include "sys/link.h" jove_owned_obj_t* obj_take(jove_obj_t *obj) { if((uintptr_t)obj < IDENT_VIRT_BASE) { reterr(EBADOBJ); } take_mutex(&obj->lock); return (jove_owned_obj_t*)obj; } jove_obj_t* obj_release(jove_owned_obj_t *obj) { if((uintptr_t)obj < IDENT_VIRT_BASE) { reterr(EBADOBJ); } release_mutex((atomic_flag*)&obj->locked.lock); return (jove_obj_t*)obj; } void* obj_deref(jove_owned_obj_t *obj) { return (void*)(((uintptr_t)obj_getvalue(obj)) | 0xFFFF800000000000ULL); } uint8_t obj_gettype(jove_owned_obj_t *obj) { return obj->locked.type; } uint8_t obj_peektype(jove_obj_t obj) { return obj.type; } void obj_settype(jove_owned_obj_t *obj, uint8_t type) { obj->locked.type = type; } uintmax_t obj_getvalue(jove_owned_obj_t *obj) { return obj->locked.value; } void obj_setvalue(jove_owned_obj_t *obj, uintmax_t value) { obj->locked.value = value & 0x00007FFFFFFFFFFFULL; } jove_obj_t objdir_peeklocal( jove_owned_obj_t *objdir_obj, uint16_t entry) { if(obj_gettype_linked(objdir_obj) != JOVE_OBJ_OBJDIR) { errno = EBADOBJ; return (jove_obj_t) { 0 }; } if(entry >= JOVE_OBJDIR_ENTRIES) { errno = EBADPATH; return (jove_obj_t) { 0 }; } jove_objdir_t *objtab = obj_deref_linked(objdir_obj); return objtab->entries[entry]; } jove_owned_obj_t* objdir_getlocal( jove_owned_obj_t *objdir_obj, uint16_t entry) { if(obj_gettype_linked(objdir_obj) != JOVE_OBJ_OBJDIR) { reterr(EBADOBJ); } if(entry >= JOVE_OBJDIR_ENTRIES) { reterr(EBADPATH); } jove_objdir_t *objtab = obj_deref_linked(objdir_obj); return obj_take(&objtab->entries[entry]); } jove_owned_obj_t* objdir_getobj( jove_owned_obj_t *objdir_obj, const uint16_t *path, size_t path_len) { if(path_len == 0) { return objdir_obj; } { errno = 0; jove_owned_obj_t *child_objdir = objdir_getlocal(objdir_obj, path[0]); if(child_objdir == 0) { reterr(EBADPATH); } jove_owned_obj_t *target_obj = objdir_getobj(child_objdir, path + 1, path_len - 1); obj_release(child_objdir); return target_obj; } }