summaryrefslogtreecommitdiffstats
path: root/04_exercise/arena/arena_list.h
diff options
context:
space:
mode:
Diffstat (limited to '04_exercise/arena/arena_list.h')
-rw-r--r--04_exercise/arena/arena_list.h32
1 files changed, 25 insertions, 7 deletions
diff --git a/04_exercise/arena/arena_list.h b/04_exercise/arena/arena_list.h
index 387f881..304209c 100644
--- a/04_exercise/arena/arena_list.h
+++ b/04_exercise/arena/arena_list.h
@@ -6,6 +6,9 @@
#define BETRIEBSYSTEME_ARENA_LIST_H
#include <stdlib.h>
+#include <stdbool.h>
+#include <stdatomic.h>
+
typedef struct Node {
void * value;
struct Node * next;
@@ -16,24 +19,39 @@ typedef struct List {
Node * first;
Node * last;
} List;
-// This structure manages an arena / memory slab to be used
+
+
// 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;
-} ArenaList;
+ atomic_char lock;
+} AtomicArenaList;
+typedef bool (*SearchFunction)(void const *);
//Initializes the node array
-ArenaList alInit(Node * arena, size_t size);
+AtomicArenaList alInit(Node * arena, size_t size);
// Return -1 if the List is full
-int alPush(ArenaList* al, void * value);
+int alPush(AtomicArenaList * al, void * value);
// Return -1 if the Node was already deleted
-int alRemove(ArenaList* al, Node * node);
+int alRemoveElem(AtomicArenaList * al, void * value);
-// Return -1 if the Node was already deleted
-int alRemoveElem(ArenaList* 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