// // Created by stefan on 10.06.20. // #ifndef BETRIEBSYSTEME_ARENA_LIST_H #define BETRIEBSYSTEME_ARENA_LIST_H #include #include #include typedef struct Node { void * value; struct Node * next; struct Node * prev; } Node; typedef struct List { Node * first; Node * last; } List; // Should we have a free list or just a bit set relative to the size of the slab? /** This structure manages an arena / memory slab to be used * This structure is thread-safe as it locks internally * It will spin until a request is safe to access the items * This also means this structure shouldn't be read externally * unless the thread doing so managed to aquire the atomic_flag */ typedef struct ArenaList { List freeList; List activeList; Node * arena; size_t size; atomic_char lock; } AtomicArenaList; typedef bool (*SearchFunction)(void const *); //Initializes the node array AtomicArenaList alInit(Node * arena, size_t size); // Return -1 if the List is full int alPush(AtomicArenaList * al, void * value); // Return -1 if the Node was already deleted int alRemoveElem(AtomicArenaList * al, void * value); /** * Searches the activeList for an element * for which the search function returns true * The function will be passed the value pointer * of a given Node * @return the Element pointed or NULL if nothing matched */ void *alFindLastElem(AtomicArenaList *al, SearchFunction f); #endif // BETRIEBSYSTEME_ARENA_LIST_H