#ifndef _NUCLEUS_OBJECT_H #define _NUCLEUS_OBJECT_H #include #include #include #include typedef struct Spinlock Spinlock; typedef struct ObjectType ObjectType; typedef struct Object Object; typedef struct ObjectList ObjectList; typedef struct Iterator Iterator; typedef int (*compare_callback_t)(void *, void *); /* Spinlock */ struct Spinlock { _Atomic int locked; refcount_t usage; Task *owner; }; /* 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 /* Object List modes */ enum ListMode { LIST_NORMAL, LIST_ORDERED, LIST_LOCKLESS, }; int check(void *addr); 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); #define swap_ref(v,o) ({ if (o) get(o); if (v) put(v); v = o; }) ObjectList *create_list(ObjectType *type, enum ListMode mode, ...); 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