#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; typedef int (*iterate_callback_t)(void *object, void *data); /* Spinlock */ struct Spinlock { char locked; refcount_t usage; union { Task *owner; cpu_t cpu; }; }; /* Object Type */ struct ObjectType { refcount_t usage; size_t size; ObjectList *objects; void *(*alloc)(void); void (*free)(Object *); void (*new)(Object *); void (*delete)(Object *); void (*copy)(Object *, Object *); }; /* Object */ struct Object { ObjectType *type; refcount_t usage; Spinlock lock; }; void *get(void *addr); void put(void *addr); void *new(ObjectType *type); void *copy(void *addr); 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, iterate_callback_t callback, void *data); ObjectList *copy_list(ObjectList *list); #endif