summaryrefslogtreecommitdiffstats
path: root/sys/link.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-09-11 11:16:36 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-09-11 11:16:36 -0400
commitbb08472a04127c994d3ea5a2cbc195f7116a03b8 (patch)
treec55910449fae5cc2a722c4b6619f4c8dde8d5b56 /sys/link.c
parent880dc3ee72809e74a5bde2275fc8f419a762b255 (diff)
downloadjove-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.c52
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;
+}