00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00026
00027 #ifndef NET_INSTAWEB_UTIL_PUBLIC_THREAD_SYSTEM_H_
00028 #define NET_INSTAWEB_UTIL_PUBLIC_THREAD_SYSTEM_H_
00029
00030 #include "net/instaweb/util/public/abstract_mutex.h"
00031 #include "net/instaweb/util/public/basictypes.h"
00032
00033 namespace net_instaweb {
00034
00035 class Timer;
00036
00039 class ThreadSystem {
00040 public:
00041 class Condvar;
00042 class Thread;
00043 class ThreadImpl;
00044
00045 class CondvarCapableMutex : public AbstractMutex {
00046 public:
00047 CondvarCapableMutex() { }
00048 virtual ~CondvarCapableMutex();
00049
00051 virtual Condvar* NewCondvar() = 0;
00052
00053 private:
00054 DISALLOW_COPY_AND_ASSIGN(CondvarCapableMutex);
00055 };
00056
00060 class RWLock : public AbstractMutex {
00061 public:
00062 RWLock() {}
00063 virtual ~RWLock();
00064
00069 virtual void ReaderLock() = 0;
00071 virtual void ReaderUnlock() = 0;
00072
00075 virtual void DCheckReaderLocked();
00076
00077 private:
00078 DISALLOW_COPY_AND_ASSIGN(RWLock);
00079 };
00080
00086 class ScopedReader {
00087 public:
00088 explicit ScopedReader(RWLock* lock) : lock_(lock) {
00089 lock_->ReaderLock();
00090 }
00091
00092 void Release() {
00095 if (lock_ != NULL) {
00096 lock_->ReaderUnlock();
00097 lock_ = NULL;
00098 }
00099 }
00100
00101 ~ScopedReader() {
00102 Release();
00103 }
00104
00105 private:
00106 RWLock* lock_;
00107
00108 DISALLOW_COPY_AND_ASSIGN(ScopedReader);
00109 };
00110
00111 enum ThreadFlags {
00112 kDetached = 0,
00113 kJoinable = 1
00114 };
00115
00116 virtual ~ThreadSystem();
00117 ThreadSystem() {}
00118
00122 virtual CondvarCapableMutex* NewMutex() = 0;
00123
00127 virtual RWLock* NewRWLock() = 0;
00128
00130 static ThreadSystem* CreateThreadSystem();
00131
00133 virtual Timer* NewTimer() = 0;
00134
00135 private:
00136 friend class Thread;
00137 friend class MockThreadSystem;
00138 friend class CheckingThreadSystem;
00139 virtual ThreadImpl* NewThreadImpl(Thread* wrapper, ThreadFlags flags) = 0;
00140
00141 DISALLOW_COPY_AND_ASSIGN(ThreadSystem);
00142 };
00143
00147 class ThreadSystem::ThreadImpl {
00148 public:
00149 virtual bool StartImpl() = 0;
00150 virtual void JoinImpl() = 0;
00151 virtual ~ThreadImpl();
00152
00153 protected:
00154 ThreadImpl() {}
00155
00156 private:
00157 DISALLOW_COPY_AND_ASSIGN(ThreadImpl);
00158 };
00159
00162 #define ScopedReader(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name)
00163
00164 }
00165
00166 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_THREAD_SYSTEM_H_