Page Speed Optimization Libraries
1.2.24.1
|
00001 // Copyright 2011 Google Inc. 00016 00017 #ifndef NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_H_ 00018 #define NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_H_ 00019 00020 #include <set> 00021 00022 #include "net/instaweb/util/public/atomic_bool.h" 00023 #include "net/instaweb/util/public/basictypes.h" 00024 #include "net/instaweb/util/public/function.h" 00025 #include "net/instaweb/util/public/queued_worker_pool.h" 00026 #include "net/instaweb/util/public/scoped_ptr.h" 00027 #include "net/instaweb/util/public/thread_system.h" 00028 #include "net/instaweb/util/public/timer.h" 00029 00033 #define SCHEDULER_CANCEL_OUTSTANDING_ALARMS_ON_DESTRUCTION 0 00034 00035 namespace net_instaweb { 00036 00037 class Timer; 00038 00048 class Scheduler { 00049 public: 00053 class Alarm; 00054 00057 struct CompareAlarms { 00058 bool operator()(const Alarm* a, const Alarm* b) const; 00059 }; 00060 00061 Scheduler(ThreadSystem* thread_system, Timer* timer); 00062 virtual ~Scheduler(); 00063 00064 ThreadSystem::CondvarCapableMutex* mutex(); 00065 00067 void DCheckLocked(); 00068 00072 00075 void BlockingTimedWaitMs(int64 timeout_ms) { 00076 BlockingTimedWaitUs(timeout_ms * Timer::kMsUs); 00077 } 00078 void BlockingTimedWaitUs(int64 timeout_us); 00079 00087 void TimedWait(int64 timeout_ms, Function* callback); 00088 00095 void Signal(); 00096 00099 00108 Alarm* AddAlarm(int64 wakeup_time_us, Function* callback); 00109 00122 bool CancelAlarm(Alarm* alarm); 00123 00132 void ProcessAlarms(int64 timeout_us); 00133 00136 Timer* timer() { return timer_; } 00137 00139 ThreadSystem* thread_system() { return thread_system_; } 00140 00144 void Wakeup(); 00145 00149 virtual void RegisterWorker(QueuedWorkerPool::Sequence* w); 00150 virtual void UnregisterWorker(QueuedWorkerPool::Sequence* w); 00151 00152 protected: 00158 virtual void AwaitWakeupUntilUs(int64 wakeup_time_us); 00159 00160 bool running_waiting_alarms() const { return running_waiting_alarms_; } 00161 00162 private: 00163 class CondVarTimeout; 00164 class CondVarCallbackTimeout; 00165 friend class SchedulerTest; 00166 00167 typedef std::set<Alarm*, CompareAlarms> AlarmSet; 00168 00169 int64 RunAlarms(bool* ran_alarms); 00171 void AddAlarmMutexHeld(int64 wakeup_time_us, Alarm* alarm); 00172 void CancelWaiting(Alarm* alarm); 00173 bool NoPendingAlarms(); 00174 00175 ThreadSystem* thread_system_; 00176 Timer* timer_; 00177 scoped_ptr<ThreadSystem::CondvarCapableMutex> mutex_; 00180 scoped_ptr<ThreadSystem::Condvar> condvar_; 00181 uint32 index_; 00182 AlarmSet outstanding_alarms_; 00183 00184 00185 int64 signal_count_; 00186 AlarmSet waiting_alarms_; 00187 bool running_waiting_alarms_; 00188 00189 DISALLOW_COPY_AND_ASSIGN(Scheduler); 00190 }; 00191 00198 class SchedulerBlockingFunction : public Function { 00199 public: 00200 explicit SchedulerBlockingFunction(Scheduler* scheduler); 00201 virtual ~SchedulerBlockingFunction(); 00202 virtual void Run(); 00203 virtual void Cancel(); 00205 bool Block(); 00206 private: 00207 Scheduler* scheduler_; 00208 bool success_; 00209 AtomicBool done_; 00210 DISALLOW_COPY_AND_ASSIGN(SchedulerBlockingFunction); 00211 }; 00212 00213 } 00214 00215 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_H_