aboutsummaryrefslogtreecommitdiff
path: root/src/rt/util/synchronized_indexed_list.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/util/synchronized_indexed_list.h')
-rw-r--r--src/rt/util/synchronized_indexed_list.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/rt/util/synchronized_indexed_list.h b/src/rt/util/synchronized_indexed_list.h
new file mode 100644
index 00000000..ca02f6ef
--- /dev/null
+++ b/src/rt/util/synchronized_indexed_list.h
@@ -0,0 +1,56 @@
+#ifndef SYNCHRONIZED_INDEXED_LIST_H
+#define SYNCHRONIZED_INDEXED_LIST_H
+
+#include "indexed_list.h"
+
+template<typename T> class synchronized_indexed_list :
+ public indexed_list<T> {
+ spin_lock _lock;
+public:
+ synchronized_indexed_list(memory_region &region) :
+ indexed_list<T>(region) {
+ // Nop.
+ }
+
+ int32_t append(T *value) {
+ int32_t index = 0;
+ _lock.lock();
+ index = indexed_list<T>::append(value);
+ _lock.unlock();
+ return index;
+ }
+
+ size_t length() {
+ size_t length = 0;
+ _lock.lock();
+ length = indexed_list<T>::length();
+ _lock.unlock();
+ return length;
+ }
+
+ bool is_empty() {
+ bool empty = false;
+ _lock.lock();
+ empty = indexed_list<T>::is_empty();
+ _lock.unlock();
+ return empty;
+ }
+
+ int32_t remove(T* value) {
+ size_t index = 0;
+ _lock.lock();
+ index = indexed_list<T>::remove(value);
+ _lock.unlock();
+ return index;
+ }
+
+ T *operator[](size_t index) {
+ T *value = NULL;
+ _lock.lock();
+ value = indexed_list<T>::operator[](index);
+ _lock.unlock();
+ return value;
+ }
+};
+
+#endif /* SYNCHRONIZED_INDEXED_LIST_H */