summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/sys/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/sys/link.c')
-rw-r--r--arch/x86_64/sys/link.c69
1 files changed, 54 insertions, 15 deletions
diff --git a/arch/x86_64/sys/link.c b/arch/x86_64/sys/link.c
index 96f8eeb..c8b08ec 100644
--- a/arch/x86_64/sys/link.c
+++ b/arch/x86_64/sys/link.c
@@ -1,19 +1,58 @@
#include "sys/link.h"
+#include "api/obj.h"
+#include "arch/x86_64/hal/paging.h"
+#include "hal/memory.h"
+#include "hal/obj.h"
+#include "jove.h"
+#include "sys/lock.h"
-jove_obj_t
-link_unlink(jove_owned_obj_t *link)
+int link_new(jove_owned_obj_t *target_obj, jove_owned_obj_t *untyped_obj, uint8_t permissions)
{
- struct obj_link *linkval = obj_deref(link);
- if(--linkval->refcount == 1) {
- jove_obj_t held_obj = linkval->obj;
- link->locked = held_obj;
- return (jove_obj_t) {
- .lock = 0,
- .type = JOVE_OBJ_UNTYPED,
- .value = (uintptr_t)linkval
- };
- }else{
- obj_settype(link, JOVE_OBJ_NONE);
- }
- return (jove_obj_t) { 0 };
+ jove_untyped_t *untyped = obj_deref(untyped_obj);
+ if(untyped->limit != sizeof(jove_link_obj_t)) return -EBADSIZE;
+
+ jove_link_obj_t *link = (jove_link_obj_t*)untyped;
+ release_mutex(&link->lock);
+ link->permissions = permissions;
+ link->refcount = 2;
+ link->obj = target_obj->locked;
+
+ obj_setvalue(target_obj, (uintptr_t)link);
+ obj_setvalue(untyped_obj, (uintptr_t)link);
+
+ obj_settype(target_obj, JOVE_OBJ_LINK);
+ obj_settype(untyped_obj, JOVE_OBJ_LINK);
+
+ return 0;
+}
+
+int link_dup(jove_owned_obj_t *link_obj, jove_owned_obj_t *dest_obj)
+{
+ jove_link_obj_t *link = obj_deref(link_obj);
+ obj_settype(dest_obj, JOVE_OBJ_LINK);
+ obj_setvalue(dest_obj, obj_getvalue(link_obj));
+ link->refcount++;
+ return 0;
+}
+
+inline jove_owned_obj_t*
+link_deref(jove_link_obj_t *link)
+{
+ return obj_take(&link->obj);
}
+
+inline jove_owned_obj_t*
+link_try_deref(jove_link_obj_t *link)
+{
+ return obj_trytake(&link->obj);
+}
+
+inline void link_lock(jove_link_obj_t *link)
+{ take_mutex(&link->lock); }
+inline void link_unlock(jove_link_obj_t *link)
+{ release_mutex(&link->lock); }
+
+inline uint8_t link_getperm(jove_link_obj_t *link)
+{ return link->permissions; }
+inline void link_setperm(jove_link_obj_t *link, uint8_t perm)
+{ link->permissions = perm; }