Nucleus
Barry Object magic and ObjectList iteration d5bd261 (3 years, 3 months ago)
diff --git a/object/manager.c b/object/manager.c
index 74b833d..85f5360 100644
--- a/object/manager.c
+++ b/object/manager.c
@@ -19,6 +19,7 @@ void *
get(void *addr)
{
Object *obj = addr;
+ ASSERT(obj->magic == OBJECT_MAGIC);
__atomic_add_fetch(&obj->type->usage, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&obj->usage, 1, __ATOMIC_RELAXED);
return addr;
@@ -29,6 +30,7 @@ void
put(void *addr)
{
Object *obj = addr;
+ ASSERT(obj->magic == OBJECT_MAGIC);
__atomic_sub_fetch(&obj->type->usage, 1, __ATOMIC_RELAXED);
if (__atomic_sub_fetch(&obj->usage, 1, __ATOMIC_RELAXED))
return;
@@ -51,6 +53,7 @@ new(ObjectType *type)
else
obj = kmalloc(type->size);
init_lock(&obj->lock);
+ obj->magic = OBJECT_MAGIC;
obj->type = type;
if (type->new)
type->new(obj);
@@ -67,6 +70,7 @@ copy(void *addr)
{
Object *parent = addr;
Object *child = NULL;
+ ASSERT(parent->magic == OBJECT_MAGIC);
if (parent->type->copy) {
child = new(parent->type);
parent->type->copy(parent, child);
@@ -74,11 +78,20 @@ copy(void *addr)
return child;
}
+refcount_t
+usage(void *addr)
+{
+ Object *obj = addr;
+ ASSERT(obj->magic == OBJECT_MAGIC);
+ return obj->usage;
+}
+
/* Lock an object */
void
lock(void *addr)
{
Object *obj = addr;
+ ASSERT(obj->magic == OBJECT_MAGIC);
acquire(&obj->lock);
}
@@ -87,5 +100,6 @@ void
unlock(void *addr)
{
Object *obj = addr;
+ ASSERT(obj->magic == OBJECT_MAGIC);
release(&obj->lock);
}