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)