BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / d5bd2619c5610bfee27fa63d0c10d32149e6d244 / object / manager.c

// Related

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);
 }