| // 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) |