aboutsummaryrefslogtreecommitdiff
path: root/src/rt/util/synchronized_indexed_list.h
diff options
context:
space:
mode:
authorMichael Bebenita <[email protected]>2010-08-27 18:26:36 -0700
committerMichael Bebenita <[email protected]>2010-09-07 18:41:07 -0700
commitf8ff013e3cc737b92b5a140dfd0ddcc5ab6773d9 (patch)
tree84daaf59d1eb899021e681927e1103cf08b91dd5 /src/rt/util/synchronized_indexed_list.h
parentInitial support for a global crate metadata cache (diff)
downloadrust-f8ff013e3cc737b92b5a140dfd0ddcc5ab6773d9.tar.xz
rust-f8ff013e3cc737b92b5a140dfd0ddcc5ab6773d9.zip
Added a few utility classes, cleaned up the include order of .h files, and started to make the Rust kernel own domain message queues rather than the Rust domains themselves.
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 */