diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-11 11:16:36 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-11 11:16:36 -0400 |
| commit | bb08472a04127c994d3ea5a2cbc195f7116a03b8 (patch) | |
| tree | c55910449fae5cc2a722c4b6619f4c8dde8d5b56 /sys/link.c | |
| parent | 880dc3ee72809e74a5bde2275fc8f419a762b255 (diff) | |
| download | jove-kernel-bb08472a04127c994d3ea5a2cbc195f7116a03b8.tar.gz jove-kernel-bb08472a04127c994d3ea5a2cbc195f7116a03b8.tar.bz2 jove-kernel-bb08472a04127c994d3ea5a2cbc195f7116a03b8.zip | |
preliminary object linking support. needs testing
Diffstat (limited to 'sys/link.c')
| -rw-r--r-- | sys/link.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/sys/link.c b/sys/link.c new file mode 100644 index 0000000..5be9457 --- /dev/null +++ b/sys/link.c @@ -0,0 +1,52 @@ +#include "link.h" +#include "arch/x86_64/hal/obj.h" +#include "hal/memory.h" + +void* +obj_deref_linked(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); + } +} + +uint8_t +obj_gettype_linked(jove_owned_obj_t *obj) +{ + switch(obj_gettype(obj)) { + case JOVE_OBJ_LINK: return obj_gettype_linked(link_deref(obj)); + default: return obj_gettype(obj); + } +} + +uint64_t +obj_getvalue_linked(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); + } +} + +jove_owned_obj_t* +link_deref(jove_owned_obj_t *link) +{ + struct obj_link *linkval = obj_deref(link); + return obj_take(&linkval->obj); +} + +jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst) +{ + struct obj_link *linkval = obj_deref(dst); + linkval->obj = *tgt; + linkval->refcount = 2; + + { + jove_owned_obj_t *tgt_owned = obj_take(tgt); + obj_settype(tgt_owned, JOVE_OBJ_LINK); + obj_setvalue(tgt_owned, (uintptr_t)linkval); + obj_release(tgt_owned); + } + return dst; +} |
