aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rt/util/indexed_list.h9
-rw-r--r--src/rt/util/synchronized_indexed_list.h16
2 files changed, 24 insertions, 1 deletions
diff --git a/src/rt/util/indexed_list.h b/src/rt/util/indexed_list.h
index cd39a0b6..b93945cc 100644
--- a/src/rt/util/indexed_list.h
+++ b/src/rt/util/indexed_list.h
@@ -10,6 +10,15 @@ public:
int32_t list_index;
};
+template<typename T>
+class indexed_list_element : public indexed_list_object {
+public:
+ T value;
+ indexed_list_element(T value) : value(value) {
+ // Nop;
+ }
+};
+
/**
* An array list of objects that are aware of their position in the list.
* Normally, objects in this list should derive from the base class
diff --git a/src/rt/util/synchronized_indexed_list.h b/src/rt/util/synchronized_indexed_list.h
index ca02f6ef..a7f79a74 100644
--- a/src/rt/util/synchronized_indexed_list.h
+++ b/src/rt/util/synchronized_indexed_list.h
@@ -7,7 +7,14 @@ template<typename T> class synchronized_indexed_list :
public indexed_list<T> {
spin_lock _lock;
public:
- synchronized_indexed_list(memory_region &region) :
+ /**
+ * Clients can use this global lock that is associated with the list to
+ * perform more coarse grained locking. Internally, the synchronized list
+ * doesn'tactually make any use of this lock.
+ */
+ spin_lock global;
+
+ synchronized_indexed_list(memory_region *region) :
indexed_list<T>(region) {
// Nop.
}
@@ -20,6 +27,13 @@ public:
return index;
}
+ bool pop(T **value) {
+ _lock.lock();
+ bool result = indexed_list<T>::pop(value);
+ _lock.unlock();
+ return result;
+ }
+
size_t length() {
size_t length = 0;
_lock.lock();