From 02baf6cb2819d40db95d6c27659e56807bd46072 Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Sun, 10 Jan 2021 21:28:35 +0100 Subject: [PATCH] implement pop and push for treiber stack --- Assignment_3/lib/CMakeLists.txt | 2 +- Assignment_3/lib/TreiberStack.cpp | 40 +++++++++++++++++++++++++++++++ Assignment_3/lib/TreiberStack.h | 14 +++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 Assignment_3/lib/TreiberStack.cpp create mode 100644 Assignment_3/lib/TreiberStack.h diff --git a/Assignment_3/lib/CMakeLists.txt b/Assignment_3/lib/CMakeLists.txt index 7dd4299..38be678 100644 --- a/Assignment_3/lib/CMakeLists.txt +++ b/Assignment_3/lib/CMakeLists.txt @@ -1 +1 @@ -add_library(sets STATIC ADT_Stack.h ADT_Stack.cpp Node.h Node.cpp Stack.h Stack.cpp SimpleLockingStack.h SimpleLockingStack.cpp) +add_library(sets STATIC ADT_Stack.h ADT_Stack.cpp Node.h Node.cpp Stack.h Stack.cpp SimpleLockingStack.h SimpleLockingStack.cpp TreiberStack.h TreiberStack.cpp) diff --git a/Assignment_3/lib/TreiberStack.cpp b/Assignment_3/lib/TreiberStack.cpp new file mode 100644 index 0000000..8715fef --- /dev/null +++ b/Assignment_3/lib/TreiberStack.cpp @@ -0,0 +1,40 @@ +#include + +#include "TreiberStack.h" +#include "ADT_Stack.h" + + +TreiberStack::TreiberStack(ADTOperationQueue * queue) : Stack(queue) { } + +void TreiberStack::push(int element) { + Node * n; + Node * t; + + while (true) { + t = top.load(std::memory_order_relaxed); + n->next = t; + if (top.compare_exchange_weak(t, n)) { + op_queue->enqueue(create_operation(methodname::push, element)); + return; + } + } + +} +int TreiberStack::pop() { + Node * n; + Node * t; + + while (true) { + t = top.load(std::memory_order_relaxed); + if (t == NULL) { + throw std::invalid_argument("Invalid operation: pop on an empty stack"); + } else if (top.compare_exchange_weak(t, t->next)) { + int data = t->get_data(); + op_queue->enqueue(create_operation(methodname::pop, data)); + return data; + } + } +} +int TreiberStack::size() { + return 0; +} \ No newline at end of file diff --git a/Assignment_3/lib/TreiberStack.h b/Assignment_3/lib/TreiberStack.h new file mode 100644 index 0000000..376c12b --- /dev/null +++ b/Assignment_3/lib/TreiberStack.h @@ -0,0 +1,14 @@ +#include + +#include "Stack.h" +#include "Node.h" + +class TreiberStack:public Stack{ + private: + std::atomic top; + public: + TreiberStack(ADTOperationQueue * queue); + void push(int element); + int pop(); + int size(); +}; \ No newline at end of file