From d8aca3ff2501f9a77e22e5afb7a30380aed205af Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Fri, 16 Oct 2026 16:42:22 -0400 Subject: remove explicit framebuffer in kernel. reduce locking in syscalls --- sys/objdir.c | 89 ++++++++++++++++++++++++------------------------------------ 1 file changed, 36 insertions(+), 53 deletions(-) (limited to 'sys/objdir.c') diff --git a/sys/objdir.c b/sys/objdir.c index 5b59ddc..df4b3eb 100644 --- a/sys/objdir.c +++ b/sys/objdir.c @@ -19,100 +19,83 @@ objdir_new(jove_owned_obj_t *untyped_obj) jove_obj_t objdir_peeklocal( - jove_owned_obj_t *objdir_obj, + jove_obj_t *objdir_obj, uint16_t entry) { - if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) { + jove_owned_obj_t *objdir = obj_take(objdir_obj); + if(obj_gettype(objdir) != JOVE_OBJ_OBJDIR) { errno = EBADOBJ; + obj_release(objdir); return (jove_obj_t) { 0 }; } if(entry >= OBJDIR_ENTRIES) { errno = EBADPATH; + obj_release(objdir); return (jove_obj_t) { 0 }; } - jove_objdir_t *objtab = obj_deref(objdir_obj); - return objtab->entries[entry]; + jove_objdir_t *objtab = obj_deref(objdir); + jove_obj_t obj = objtab->entries[entry]; + obj_release(objdir); + return obj; } jove_owned_obj_t* objdir_getlocal( - jove_owned_obj_t *objdir_obj, + jove_obj_t *objdir_obj, uint16_t entry) { - if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) { - reterr(EBADOBJ); - } - if(entry >= OBJDIR_ENTRIES) { - reterr(EBADPATH); - } - - jove_objdir_t *objtab = obj_deref(objdir_obj); - return obj_take(&objtab->entries[entry]); + jove_owned_obj_t *objdir = obj_take(objdir_obj); + jove_owned_obj_t *obj = objdir_getlocal_locked(objdir, entry); + obj_release(objdir); + return obj; } -jove_owned_obj_t* -objdir_trygetlocal( - jove_owned_obj_t *objdir_obj, - uint16_t entry) +jove_owned_obj_t *objdir_getlocal_locked(jove_owned_obj_t *objdir, objpath_part_t entry) { - if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) { + if(obj_gettype(objdir) != JOVE_OBJ_OBJDIR) { + obj_release(objdir); reterr(EBADOBJ); } if(entry >= OBJDIR_ENTRIES) { + obj_release(objdir); reterr(EBADPATH); } - jove_objdir_t *objtab = obj_deref(objdir_obj); - return obj_trytake(&objtab->entries[entry]); + jove_objdir_t *objtab = obj_deref(objdir); + jove_owned_obj_t *obj = obj_take(&objtab->entries[entry]); + return obj; } jove_owned_obj_t* objdir_getobj( - jove_owned_obj_t *objdir_obj, + jove_obj_t *objdir_obj, const uint16_t *path, size_t path_len) { - errno = 0; - if(path_len == 0) { - return objdir_obj; - } - { - jove_owned_obj_t *child_objdir = objdir_getlocal(objdir_obj, path[0]); - if(child_objdir == 0) { - reterr(EBADPATH); - } + jove_owned_obj_t *objdir = obj_take(objdir_obj); + jove_owned_obj_t *obj = objdir_getobj_locked(objdir, path, path_len); + obj_release(objdir); + return obj; - jove_owned_obj_t *target_obj = objdir_getobj(child_objdir, path + 1, path_len - 1); - obj_release(child_objdir); - return target_obj; - } } -jove_owned_obj_t* -objdir_trygetobj( - jove_owned_obj_t *objdir_obj, - const uint16_t *path, - size_t path_len) +jove_owned_obj_t *objdir_getobj_locked(jove_owned_obj_t *objdir, + const objpath_part_t *path, + size_t path_len) { errno = 0; - if(path_len == 0) { - return objdir_obj; - } - { - jove_owned_obj_t *child_objdir = objdir_trygetlocal(objdir_obj, path[0]); - if(child_objdir == 0) { - return 0; - } + if(path_len == 0) return objdir; - jove_owned_obj_t *target_obj = objdir_trygetobj(child_objdir, path + 1, path_len - 1); - obj_release(child_objdir); - return target_obj; - } + jove_owned_obj_t *child_obj = objdir_getlocal_locked(objdir, path[0]); + obj_release(objdir); + + if(child_obj == NULL) return NULL; + return objdir_getobj_locked(child_obj, &path[1], path_len - 1); } bool -objdir_compare(jove_owned_obj_t *objdir_obj, objpath_part_t entry, jove_obj_t *obj) +objdir_compare(jove_obj_t *objdir_obj, objpath_part_t entry, jove_obj_t *obj) { jove_obj_t peekobj = objdir_peeklocal(objdir_obj, entry); return obj_compare(&peekobj, obj); -- cgit v1.2.3