00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_ABSTRACT_MUTEX_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_ABSTRACT_MUTEX_H_
00021
00022 #include "net/instaweb/util/public/basictypes.h"
00023
00024 namespace net_instaweb {
00025
00027 class AbstractMutex {
00028 public:
00029 virtual ~AbstractMutex();
00030 virtual void Lock() = 0;
00031 virtual void Unlock() = 0;
00034 virtual void DCheckLocked();
00035 };
00036
00038 class ScopedMutex {
00039 public:
00040 explicit ScopedMutex(AbstractMutex* mutex) : mutex_(mutex) {
00041 mutex_->Lock();
00042 }
00043
00044 void Release() {
00045 if (mutex_ != NULL) {
00046 mutex_->Unlock();
00047 mutex_ = NULL;
00048 }
00049 }
00050
00051 ~ScopedMutex() {
00052 Release();
00053 }
00054
00055 private:
00056 AbstractMutex* mutex_;
00057
00058 DISALLOW_COPY_AND_ASSIGN(ScopedMutex);
00059 };
00062 #define ScopedMutex(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name)
00063
00064 }
00065
00066 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_ABSTRACT_MUTEX_H_