Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/iot2
[iot2.git] / iotjava / iotrmi / C++ / ConcurrentLinkedListQueue.cpp
index 3fd02736249b7dbe30cdffade393acda05c274f4..9b6826d765d184ada8cde7b3de0fd8d1a6b62ef8 100644 (file)
@@ -6,9 +6,10 @@
 using namespace std;
 
 
-Node::Node(void* val) {
+Node::Node(char* val, int len) {
 
        value = val;
+       length = len;
        next = NULL;
 }
 
@@ -26,12 +27,18 @@ Node::~Node() {
 }
 
 
-void* Node::getValue() {
+char* Node::getValue() {
 
        return value;
 }
 
 
+int Node::getLength() {
+
+       return length;
+}
+
+
 Node* Node::getNext() {
 
        return next;
@@ -53,21 +60,21 @@ ConcurrentLinkedListQueue::ConcurrentLinkedListQueue() {
 
 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;
        }
@@ -75,9 +82,9 @@ void ConcurrentLinkedListQueue::enqueue(void* value) {
 
 
 // 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 {
@@ -87,7 +94,7 @@ void* ConcurrentLinkedListQueue::dequeue() {
                        tail = NULL;
                } else
                        head = head->getNext();
-               void* retVal = retEl->getValue();
+               char* retVal = retEl->getValue();
                // Prepare retEl for deletion
                retEl->setNext(NULL);
                delete retEl;
@@ -96,80 +103,33 @@ void* ConcurrentLinkedListQueue::dequeue() {
        }
 }
 
+// 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;
-}