#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 Iterator Iterator; typedef struct Task Task; /* Spinlock */ struct Spinlock { _Atomic char locked; refcount_t usage; union { Task *owner; cpu_t cpu; }; }; /* Object Type */ struct ObjectType { refcount_t usage; const char *name; size_t size; ObjectList *objects; void *(*alloc)(void); void (*free)(Object *); void (*new)(Object *); void (*delete)(Object *); void (*copy)(Object *, Object *); }; /* Object */ struct Object { uint32_t magic; ObjectType *type; refcount_t usage; Spinlock lock; }; #define OBJECT_MAGIC 0x10032004 void *get(void *addr); void put(void *addr); void *new(ObjectType *type); void *copy(void *addr); refcount_t usage(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 *get_nth_item(ObjectList *list, off_t n); ObjectList *copy_list(ObjectList *list); void concat_list(ObjectList *src, ObjectList *dest); Iterator *iterate(ObjectList *list); void *first(Iterator *iter); void *last(Iterator *iter); void *next(Iterator *iter); void *prev(Iterator *iter); int done_iterating(Iterator *iter); #define foreach(l,i) for (Iterator *(__l_ ## i) = iterate(l); (__l_ ## i); \ done_iterating(__l_ ## i), (__l_ ## i) = NULL) \ for (i = first(__l_ ## i); i; i = next(__l_ ## i)) #endif