From 239f248456ad00f894dc26dceefa968898738c9d Mon Sep 17 00:00:00 2001 From: Stefan Zabka Date: Mon, 22 Jun 2020 16:43:42 +0200 Subject: Getting make to run --- 04_exercise/arena/arena_list.c | 164 ----------------------------------------- 1 file changed, 164 deletions(-) delete mode 100644 04_exercise/arena/arena_list.c (limited to '04_exercise/arena/arena_list.c') diff --git a/04_exercise/arena/arena_list.c b/04_exercise/arena/arena_list.c deleted file mode 100644 index 1453297..0000000 --- a/04_exercise/arena/arena_list.c +++ /dev/null @@ -1,164 +0,0 @@ -// -// Created by stefan on 10.06.20. -// -#include "arena_list.h" -#include -#include -#include - -#include -static const bool DEBUG = false; - -bool listContains(List const * const list ,Node const * const needle) { - for(Node * current = list ->first; current != NULL; current = current->next) { - if(current == needle) { - return true; - } - } - return false; -} -Node *listPopFront(List *list) { - Node *front = list->first; - if (front == NULL) { - return NULL; - } - - list->first = front->next; - if (front == list->last) { - // Only Node in the list - list->last = NULL; - return front; - } - - list->first->prev = NULL; - front->next = NULL; - - return front; -} - -Node *listPopBack(List *list) { - Node *back = list->last; - if (back == NULL) { - return NULL; - } - - list->last = back->prev; - if (back == list->first) { - // Only Node in the list - list->last = NULL; - return back; - } - - list->last->next = NULL; - back->prev = NULL; - - return back; -} - -void listPushFront(List *list, Node *new) { - if (list->first == NULL) { - // List was empty - list->first = new; - list->last = new; - return; - } - new->prev = NULL; - new->next = list->first; - new->next->prev = new; - list->first = new; -} - -// void listPushBack(List *list, Node *value) {} - -AtomicArenaList alInit(Node *arena, size_t size) { - AtomicArenaList al = {.activeList = (List){.first = NULL, .last = NULL}, - .freeList = (List){.first = arena, .last = &arena[size - 1]}, - .arena = arena, - .size = size}; - atomic_init(&al.lock, RW_UNLOCKED); - arena[0] = (Node){.value = NULL, .prev = NULL, .next = &arena[1]}; - for (size_t i = 1; i < size - 1; ++i) { - arena[i] = (Node){.value = NULL, .prev = &arena[i - 1], .next = &arena[i + 1]}; - } - arena[size - 1] = (Node){.value = NULL, .prev = &arena[size - 2], .next = NULL}; - return al; -} - -int alPush(AtomicArenaList *al, void *value) { - if(DEBUG) - fprintf(stderr, "Thread %lu: Pushing \n", pthread_self() % 1000); - rwLockWrite(&al->lock); - Node *current = listPopFront(&al->freeList); - // List is empty - if (current == NULL) { - rwUnlockWrite(&al->lock); - return -1; - } - current->value = value; - listPushFront(&al->activeList, current); - rwUnlockWrite(&al->lock); - return 0; -} - -int alRemoveElem(AtomicArenaList *al, void *value) { - if(DEBUG) - fprintf(stderr, "Thread %lu: Removing element \n", pthread_self() % 1000); - rwLockWrite(&al->lock); - size_t i = 0; - for (; i < al->size; ++i) { - if (al->arena[i].value != value) { - continue; - } - } - Node *node = &al->arena[i]; - // Irgendwie removen wir das Element zwei Mal und ich verstehe nicht warum - if(i == al->size || listContains(&al->activeList,node)) { - rwUnlockWrite(&al->lock); - return -1; - } - - if (node == al->activeList.first) { - listPopFront(&al->activeList); - listPushFront(&al->freeList, node); - atomic_char *a = &al->lock; - rwUnlockWrite(a); - return 0; - } - if (node == al->activeList.last) { - listPopBack(&al->activeList); - listPushFront(&al->freeList, node); - rwUnlockWrite(&al->lock); - return 0; - } - // The node is somewhere in the middle - Node *prev = node->prev; - Node *next = node->next; - - next->prev = prev; - prev->next = next; - - listPushFront(&al->freeList, node); - rwUnlockWrite(&al->lock); - return 0; -} - -void *alFindLastElem(AtomicArenaList *al, SearchFunction f) { - if(DEBUG) - fprintf(stderr, "Thread %lu: Finding last element \n", pthread_self() % 1000); - - rwLockRead(&al->lock); - - List const *const actList = &al->activeList; - if (actList->last == NULL) { - rwUnlockRead(&al->lock); - return NULL; - } - for (Node *current = actList->last; current != NULL; current = current->prev) { - if (f(current->value)) { - rwUnlockRead(&al->lock); - return current; - } - } - rwUnlockRead(&al->lock); - return NULL; -} -- cgit v1.2.3-54-g00ecf