#ifndef _NUCLEUS_OBJECT_H #define _NUCLEUS_OBJECT_H #include #include #include typedef struct Spinlock Spinlock; typedef struct ObjectType ObjectType; typedef struct Object Object; typedef struct ObjectList ObjectList; typedef struct Task Task; /* Just a pointer, no need for full definition */ typedef int (*callback_t)(void *object, void *data); /* Spinlock */ struct Spinlock { char locked; refcount_t usage; union { Task *owner; cpu_t cpu; }; }; /* Object Type */ struct ObjectType { unsigned int count; refcount_t usage; size_t size; ObjectList *objects; void *(*alloc)(void); void (*free)(Object *); void (*new)(Object *); void (*delete)(Object *); }; /* Object */ struct Object { ObjectType *type; refcount_t usage; Spinlock lock; }; void *get(void *addr); void put(void *addr); void *new(ObjectType *type); void lock(void *addr); void unlock(void *addr); ObjectList *create_list(ObjectType *type); void destroy_list(ObjectList *list); void add(ObjectList *list, void *addr); void remove(ObjectList *list, void *addr); void *pop_from_start(ObjectList *list); void *pop_from_end(ObjectList *list); size_t count(ObjectList *list); void iterate(ObjectList *list, callback_t callback, void *data); #endif