aboutsummaryrefslogtreecommitdiff
path: root/gold/gold-threads.h
diff options
context:
space:
mode:
Diffstat (limited to 'gold/gold-threads.h')
-rw-r--r--gold/gold-threads.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/gold/gold-threads.h b/gold/gold-threads.h
new file mode 100644
index 0000000..e2a8388
--- /dev/null
+++ b/gold/gold-threads.h
@@ -0,0 +1,101 @@
+// gold-threads.h -- thread support for gold -*- C++ -*-
+
+// gold can be configured to support threads. If threads are
+// supported, the user can specify at runtime whether or not to
+// support them. This provides an interface to manage locking
+// accordingly.
+
+// Lock
+// A simple lock class.
+
+#ifndef GOLD_THREADS_H
+#define GOLD_THREADS_H
+
+namespace gold
+{
+
+class Lock_impl;
+class Condvar;
+
+// A simple lock class.
+
+class Lock
+{
+ public:
+ Lock();
+ ~Lock();
+
+ // Acquire the lock.
+ void
+ acquire();
+
+ // Release the lock.
+ void
+ release();
+
+ private:
+ // This class can not be copied.
+ Lock(const Lock&);
+ Lock& operator=(const Lock&);
+
+ friend class Condvar;
+ Lock_impl*
+ get_impl() const
+ { return this->lock_; }
+
+ Lock_impl* lock_;
+};
+
+// RAII for Lock.
+
+class Hold_lock
+{
+ public:
+ Hold_lock(Lock& lock)
+ : lock_(lock)
+ { this->lock_.acquire(); }
+
+ ~Hold_lock()
+ { this->lock_.release(); }
+
+ private:
+ // This class can not be copied.
+ Hold_lock(const Hold_lock&);
+ Hold_lock& operator=(const Hold_lock&);
+
+ Lock& lock_;
+};
+
+class Condvar_impl;
+
+// A simple condition variable class. It is always associated with a
+// specific lock.
+
+class Condvar
+{
+ public:
+ Condvar(Lock& lock);
+ ~Condvar();
+
+ // Wait for the condition variable to be signalled. This should
+ // only be called when the lock is held.
+ void
+ wait();
+
+ // Signal the condition variable. This should only be called when
+ // the lock is held.
+ void
+ signal();
+
+ private:
+ // This class can not be copied.
+ Condvar(const Condvar&);
+ Condvar& operator=(const Condvar&);
+
+ Lock& lock_;
+ Condvar_impl* condvar_;
+};
+
+} // End namespace gold.
+
+#endif // !defined(GOLD_THREADS_H)