using namespace std;
-Node::Node(void* val) {
+Node::Node(char* val, int len) {
value = val;
+ length = len;
next = NULL;
}
}
-void* Node::getValue() {
+char* Node::getValue() {
return value;
}
+int Node::getLength() {
+
+ return length;
+}
+
+
Node* Node::getNext() {
return next;
ConcurrentLinkedListQueue::~ConcurrentLinkedListQueue() {
- void* val = NULL;
+ char* val = NULL;
do { // Dequeue and free everything up
val = dequeue();
} while(val != NULL);
}
-void ConcurrentLinkedListQueue::enqueue(void* value) {
+void ConcurrentLinkedListQueue::enqueue(char* value, int length) {
- lock_guard<mutex> guard(mtx);
+ lock_guard<mutex> guard(queueMutex);
if (tail == NULL && head == NULL) { // first element
- tail = new Node(value);
+ tail = new Node(value, length);
head = tail; // Both tail and head point to the first element
} else { // Next elements
- Node* newEl = new Node(value);
+ Node* newEl = new Node(value, length);
tail->setNext(newEl);
tail = newEl;
}
// Return element and remove from list
-void* ConcurrentLinkedListQueue::dequeue() {
+char* ConcurrentLinkedListQueue::dequeue() {
- lock_guard<mutex> guard(mtx);
+ lock_guard<mutex> guard(queueMutex);
if (tail == NULL && head == NULL) { // empty
return NULL;
} else {
tail = NULL;
} else
head = head->getNext();
- void* retVal = retEl->getValue();
+ char* retVal = retEl->getValue();
// Prepare retEl for deletion
retEl->setNext(NULL);
delete retEl;
}
}
+// Return element, length, and remove it from list
+char* ConcurrentLinkedListQueue::deQAndGetLength(int* length) {
-void enQ(ConcurrentLinkedListQueue* methodQueue, char** test) {
-
- /*char* test = new char[3];
- test[0] = 'a';
- test[1] = 'b';
- test[2] = 'c';*/
- void* ptr = test;
- for(int i=0; i<10; i++ ) {
- cout << "Enqueuing: " << test << " address: " << ptr << endl;
- methodQueue->enqueue(ptr);
- }
-}
-
-
-void deQ(ConcurrentLinkedListQueue* methodQueue) {
-
- for(int i=0; i<12; i++) {
- void* result = methodQueue->dequeue();
- if (result != NULL) {
- cout << "Dequeue result: " << result << endl;
- cout << "Dequeue result: " << *((char**) result) << endl;
- } else {
- cout << "Result is NULL!!! End of queue!" << endl;
- }
+ lock_guard<mutex> guard(queueMutex);
+ if (tail == NULL && head == NULL) { // empty
+ *length = 0;
+ return 0;
+ } else {
+ Node* retEl = head;
+ if (head->getNext() == NULL) {
+ head = NULL;
+ tail = NULL;
+ } else
+ head = head->getNext();
+ char* retVal = retEl->getValue();
+ *length = retEl->getLength();
+ // Prepare retEl for deletion
+ retEl->setNext(NULL);
+ delete retEl;
+ // Return just the value
+ //cout << "Print bytes inside dequeue: ";
+ //IoTRMIUtil::printBytes(*((char**) retVal), *length, false);
+ //cout << "Dequeuing: " << *((char**) retVal) << endl;
+ //cout << "Dequeuing address: " << std::ref(retVal) << endl;
+ return retVal;
}
}
-int main(int argc, char *argv[])
-{
- ConcurrentLinkedListQueue* methodQueue = new ConcurrentLinkedListQueue();
- /*cout << "Dequeue result: " << methodQueue->dequeue() << endl;
- string str = "this is a test string";
- const char* test = str.c_str();
- const char** test2 = &test;
- cout << "Initial result: " << test << endl;
- cout << "Initial result 2: " << *test2 << endl;
- void* ptr = &test;
- cout << "Pointer: " << ptr << endl;
- methodQueue->enqueue(ptr);
- methodQueue->enqueue(ptr);
- void* result = methodQueue->dequeue();
- cout << "Result: " << result << endl;
- cout << "Dequeue result: " << *((const char**) result) << endl;
- void* result2 = methodQueue->dequeue();
- cout << "Dequeue result: " << *((const char**) result2) << endl;
- void* result3 = methodQueue->dequeue();
- cout << "Dequeue result: " << result3 << endl;*/
- //thread t1,t2;
-
- //t1 = thread(enQ, methodQueue);
- //t2 = thread(deQ, methodQueue);
-
- //t1.join();
- //t2.join();
-
- char* test = new char[3];
- test[0] = 'a';
- test[1] = 'b';
- test[2] = 'c';
- void* ptr = &test;
- methodQueue->enqueue(ptr);
- void* result = methodQueue->dequeue();
- cout << "Dequeue result: " << *((char**) result) << endl;
-
- thread t1,t2;
-
- t1 = thread(enQ, methodQueue, &test);
- t2 = thread(deQ, methodQueue);
-
- t1.join();
- t2.join();
-
- return 0;
-}