From 8085c7634979f38c1b152d0a35b98c2447ce497a Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Thu, 24 Jun 2010 15:51:29 -0500 Subject: Add messaging --- src/include/util/locked/list.H | 153 ++++++++++++++++++++++++++++++++++++++++ src/include/util/locked/queue.H | 2 +- 2 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/include/util/locked/list.H (limited to 'src/include/util') diff --git a/src/include/util/locked/list.H b/src/include/util/locked/list.H new file mode 100644 index 000000000..e4bc0f99c --- /dev/null +++ b/src/include/util/locked/list.H @@ -0,0 +1,153 @@ +#ifndef __UTIL_LOCKED_LIST_H +#define __UTIL_LOCKED_LIST_H + +#include + +namespace Util +{ + namespace Locked + { + template + class List + { + public: + List() : head(NULL), tail(NULL), lock() {}; + ~List() {}; + + _T* remove(); + void insert(_T*); + + void erase(_T* node); + void erase(_K& key); + + _T* find(_K& key); + + protected: + _T* head; + _T* tail; + + _S lock; + + void __lock(); + void __unlock(); + }; + + template + _T* List<_T,_K,locked,_S>::remove() + { + _T* item = NULL; + + __lock(); + + if (tail != NULL) + { + item = tail; + if (head == tail) + head = tail = NULL; + else + tail = item->prev; + } + + __unlock(); + + return item; + } + + template + void List<_T,_K,locked,_S>::insert(_T* item) + { + __lock(); + + if (head == NULL) + { + item->next = item->prev = NULL; + head = tail = item; + } + else + { + item->prev = NULL; + item->next = head; + head = head->prev = item; + } + + __unlock(); + } + + template + void List<_T,_K,locked,_S>::__lock() + { + Util::Locked::LockHelper(lock).lock(); + } + + template + void List<_T,_K,locked,_S>::__unlock() + { + Util::Locked::LockHelper(lock).unlock(); + } + + template + void List<_T,_K,locked,_S>::erase(_T* node) + { + __lock(); + + if (node == head) + head = node->next; + else + node->prev->next = node->next; + + if (node == tail) + tail = node->prev; + else + node->next->prev = node->prev; + + __unlock(); + } + + template + void List<_T,_K,locked,_S>::erase(_K& key) + { + __lock(); + + _T* node = head; + + while((node != NULL) && (node->key != key)) + node = node->next; + + if (node != NULL) + { + if (node == head) + head = node->next; + else + node->prev->next = node->next; + + if (node == tail) + tail = node->prev; + else + node->next->prev = node->prev; + } + + __unlock(); + + return node; + } + + template + _T* List<_T,_K,locked,_S>::find(_K& key) + { + __lock(); + + _T* node = head; + + while((node != NULL) && (node->key != key)) + node = node->next; + + __unlock(); + + return node; + } + } +} + + +#endif diff --git a/src/include/util/locked/queue.H b/src/include/util/locked/queue.H index 51d2c430e..651e24a80 100644 --- a/src/include/util/locked/queue.H +++ b/src/include/util/locked/queue.H @@ -17,7 +17,7 @@ namespace Util _T* remove(); void insert(_T*); - private: + protected: _T* head; _T* tail; -- cgit v1.2.1