BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 5be6a64670a09857d2128737723e0b5d4021271e

// Related

Nucleus

Barry Global object lists 5be6a64 (3 years, 3 months ago)
diff --git a/include/nucleus/object.h b/include/nucleus/object.h
index 7386984..63ac2ac 100644
--- a/include/nucleus/object.h
+++ b/include/nucleus/object.h
@@ -29,6 +29,7 @@ struct ObjectType {
 	unsigned int count;
 	refcount_t usage;
 	size_t size;
+	ObjectList *objects;
 	void *(*alloc)(void);
 	void (*free)(Object *);
 	void (*new)(Object *);
@@ -42,8 +43,6 @@ struct Object {
 	Spinlock lock;
 };
 
-extern ObjectType listType;
-
 void *get(void *addr);
 void put(void *addr);
 void *new(ObjectType *type);
diff --git a/object/list.c b/object/list.c
index 75725e5..3e9b96b 100644
--- a/object/list.c
+++ b/object/list.c
@@ -22,6 +22,7 @@ struct ObjectList {
 	Spinlock lock;
 };
 
+void init_lock(Spinlock *lock);
 void acquire(Spinlock *lock);
 void release(Spinlock *lock);
 
@@ -30,6 +31,7 @@ ObjectList *
 create_list(ObjectType *type)
 {
 	ObjectList *list = kmalloc(sizeof(ObjectList));
+	init_lock(&list->lock);
 	list->type = type;
 	return list;
 }
diff --git a/object/manager.c b/object/manager.c
index 124ebbc..c50d45d 100644
--- a/object/manager.c
+++ b/object/manager.c
@@ -10,6 +10,7 @@
 #include <nucleus/memory.h>
 #include <nucleus/panic.h>
 
+void init_lock(Spinlock *lock);
 void acquire(Spinlock *lock);
 void release(Spinlock *lock);
 
@@ -34,6 +35,7 @@ put(void *addr)
 	__atomic_sub_fetch(&obj->type->count, 1, __ATOMIC_RELAXED);
 	if (obj->type->delete)
 		obj->type->delete(obj);
+	remove(obj->type->objects, obj);
 	if (obj->type->free)
 		obj->type->free(obj);
 	else
@@ -51,6 +53,10 @@ new(ObjectType *type)
 		obj = kmalloc(type->size);
 	if (type->new)
 		type->new(obj);
+	if (!type->objects)
+		type->objects = create_list(type);
+	add(type->objects, obj);
+	init_lock(&obj->lock);
 	obj->type = type;
 	__atomic_add_fetch(&type->count, 1, __ATOMIC_RELAXED);
 	return get(obj);
diff --git a/task/task.c b/task/task.c
index 8b64df0..7026698 100644
--- a/task/task.c
+++ b/task/task.c
@@ -75,6 +75,7 @@ init_tasking(void)
 
 	current = new(&taskType);
 	asm volatile("mov %%cr3, %0" : "=r" (current->pageDir));
+	current->state = RUNNING;
 
 	init_scheduler();
 	register_interrupt(0, timer_handler);
diff --git a/task/time.c b/task/time.c
index 39675e4..345b491 100644
--- a/task/time.c
+++ b/task/time.c
@@ -17,10 +17,9 @@ timer_handler(struct InterruptFrame *frame)
 {
 	monotonic++;
 
-	/* Account timeslices */
-	slice[CPUID]++;
 	if (!current)
 		return;
+	slice[CPUID]++;
 
 	/* Call scheduler */
 	if (slice[CPUID] < current->priority)