00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_BASED_ABSTRACT_LOCK_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_BASED_ABSTRACT_LOCK_H_
00021
00022 #include "net/instaweb/util/public/basictypes.h"
00023 #include "net/instaweb/util/public/named_lock_manager.h"
00024
00025 namespace net_instaweb {
00026
00027 class Function;
00028 class Scheduler;
00029
00036 class SchedulerBasedAbstractLock : public NamedLock {
00037 public:
00038 virtual ~SchedulerBasedAbstractLock();
00039 virtual bool LockTimedWait(int64 wait_ms);
00040 virtual void LockTimedWait(int64 wait_ms, Function* callback);
00041
00042 virtual bool LockTimedWaitStealOld(int64 wait_ms, int64 steal_ms);
00043 virtual void LockTimedWaitStealOld(
00044 int64 wait_ms, int64 steal_ms, Function* callback);
00045
00046 protected:
00047 virtual Scheduler* scheduler() const = 0;
00048
00049 private:
00050 typedef bool (SchedulerBasedAbstractLock::*TryLockMethod)(int64 steal_ms);
00051 bool TryLockIgnoreSteal(int64 steal_ignored);
00052 bool BusySpin(TryLockMethod try_lock, int64 steal_ms);
00053 void PollAndCallback(TryLockMethod try_lock, int64 steal_ms,
00054 int64 wait_ms, Function* callback);
00055 };
00056
00057 }
00058
00059 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_BASED_ABSTRACT_LOCK_H_