4 #include "ConcurrentLinkedListQueue.hpp"
9 Node::Node(void* val) {
29 void* Node::getValue() {
35 Node* Node::getNext() {
41 void Node::setNext(Node* nxt) {
47 ConcurrentLinkedListQueue::ConcurrentLinkedListQueue() {
54 ConcurrentLinkedListQueue::~ConcurrentLinkedListQueue() {
57 do { // Dequeue and free everything up
63 void ConcurrentLinkedListQueue::enqueue(void* value) {
65 lock_guard<mutex> guard(mtx);
66 if (tail == NULL && head == NULL) { // first element
67 tail = new Node(value);
68 head = tail; // Both tail and head point to the first element
69 } else { // Next elements
70 Node* newEl = new Node(value);
77 // Return element and remove from list
78 void* ConcurrentLinkedListQueue::dequeue() {
80 lock_guard<mutex> guard(mtx);
81 if (tail == NULL && head == NULL) { // empty
85 if (head->getNext() == NULL) {
89 head = head->getNext();
90 void* retVal = retEl->getValue();
91 // Prepare retEl for deletion
94 // Return just the value
100 void enQ(ConcurrentLinkedListQueue* methodQueue, char** test) {
102 /*char* test = new char[3];
107 for(int i=0; i<10; i++ ) {
108 cout << "Enqueuing: " << test << " address: " << ptr << endl;
109 methodQueue->enqueue(ptr);
114 void deQ(ConcurrentLinkedListQueue* methodQueue) {
116 for(int i=0; i<12; i++) {
117 void* result = methodQueue->dequeue();
118 if (result != NULL) {
119 cout << "Dequeue result: " << result << endl;
120 cout << "Dequeue result: " << *((char**) result) << endl;
122 cout << "Result is NULL!!! End of queue!" << endl;
128 int main(int argc, char *argv[])
130 ConcurrentLinkedListQueue* methodQueue = new ConcurrentLinkedListQueue();
131 /*cout << "Dequeue result: " << methodQueue->dequeue() << endl;
132 string str = "this is a test string";
133 const char* test = str.c_str();
134 const char** test2 = &test;
135 cout << "Initial result: " << test << endl;
136 cout << "Initial result 2: " << *test2 << endl;
138 cout << "Pointer: " << ptr << endl;
139 methodQueue->enqueue(ptr);
140 methodQueue->enqueue(ptr);
141 void* result = methodQueue->dequeue();
142 cout << "Result: " << result << endl;
143 cout << "Dequeue result: " << *((const char**) result) << endl;
144 void* result2 = methodQueue->dequeue();
145 cout << "Dequeue result: " << *((const char**) result2) << endl;
146 void* result3 = methodQueue->dequeue();
147 cout << "Dequeue result: " << result3 << endl;*/
150 //t1 = thread(enQ, methodQueue);
151 //t2 = thread(deQ, methodQueue);
156 char* test = new char[3];
161 methodQueue->enqueue(ptr);
162 void* result = methodQueue->dequeue();
163 cout << "Dequeue result: " << *((char**) result) << endl;
167 t1 = thread(enQ, methodQueue, &test);
168 t2 = thread(deQ, methodQueue);