#include "obj.h" #include "sys/lock.h" #include "lib/printf.h" #include "paging.h" #include "hal/obj.h" #include "jove.h" #include "sys/link.h" jove_owned_obj_t* obj_take(jove_obj_t *obj) { if((uintptr_t)obj < IDENT_VIRT_BASE) { reterr(EBADOBJ); } take_mutex(&obj->lock); return (jove_owned_obj_t*)obj; } jove_owned_obj_t* obj_trytake(jove_obj_t *obj) { if((uintptr_t)obj < IDENT_VIRT_BASE) { reterr(EBADOBJ); } if(try_take_mutex(&obj->lock)) { reterr(EBUSY); } return (jove_owned_obj_t*)obj; } jove_obj_t *obj_asunowned(jove_owned_obj_t *obj) { return (jove_obj_t*)obj; } jove_obj_t* obj_release(jove_owned_obj_t *obj) { if((uintptr_t)obj < IDENT_VIRT_BASE) { reterr(EBADOBJ); } release_mutex((atomic_flag*)&obj->locked.lock); return (jove_obj_t*)obj; } void* obj_deref(jove_owned_obj_t *obj) { return (void*)(((uintptr_t)obj_getvalue(obj)) | IDENT_VIRT_BASE); } uint8_t obj_gettype(jove_owned_obj_t *obj) { return obj->locked.type; } uint8_t obj_peektype(jove_obj_t obj) { return obj.type; } void obj_settype(jove_owned_obj_t *obj, uint8_t type) { obj->locked.type = type; } uintmax_t obj_getvalue(jove_owned_obj_t *obj) { return obj->locked.value; } void obj_setvalue(jove_owned_obj_t *obj, uintmax_t value) { obj->locked.value = value & 0x00007FFFFFFFFFFFULL; } bool obj_compare(jove_obj_t *a, jove_obj_t *b) { return a->data == b->data; }