summaryrefslogtreecommitdiffstats
path: root/sys/objdir.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-16 16:42:22 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-16 16:42:22 -0400
commitd8aca3ff2501f9a77e22e5afb7a30380aed205af (patch)
treea27db1749a35aea07317406f170a2d9b2a799ce7 /sys/objdir.c
parent548506392b789f58b1556a6ffca917441e1d89fd (diff)
downloadjove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.tar.gz
jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.tar.bz2
jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.zip
remove explicit framebuffer in kernel. reduce locking in syscalls
Diffstat (limited to 'sys/objdir.c')
-rw-r--r--sys/objdir.c89
1 files changed, 36 insertions, 53 deletions
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);