Page Speed Optimization Libraries
1.3.25.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 00046 class Scheduler { 00047 public: 00051 class Alarm; 00052 00055 struct CompareAlarms { 00056 bool operator()(const Alarm* a, const Alarm* b) const; 00057 }; 00058 00059 Scheduler(ThreadSystem* thread_system, Timer* timer); 00060 virtual ~Scheduler(); 00061 00062 ThreadSystem::CondvarCapableMutex* mutex(); 00063 00065 void DCheckLocked(); 00066 00070 00073 void BlockingTimedWaitMs(int64 timeout_ms) { 00074 BlockingTimedWaitUs(timeout_ms * Timer::kMsUs); 00075 } 00076 void BlockingTimedWaitUs(int64 timeout_us); 00077 00085 void TimedWait(int64 timeout_ms, Function* callback); 00086 00093 void Signal(); 00094 00097 00106 Alarm* AddAlarm(int64 wakeup_time_us, Function* callback); 00107 00120 bool CancelAlarm(Alarm* alarm); 00121 00130 void ProcessAlarms(int64 timeout_us); 00131 00134 Timer* timer() { return timer_; } 00135 00137 ThreadSystem* thread_system() { return thread_system_; } 00138 00142 void Wakeup(); 00143 00147 virtual void RegisterWorker(QueuedWorkerPool::Sequence* w); 00148 virtual void UnregisterWorker(QueuedWorkerPool::Sequence* w); 00149 00150 protected: 00156 virtual void AwaitWakeupUntilUs(int64 wakeup_time_us); 00157 00158 bool running_waiting_alarms() const { return running_waiting_alarms_; } 00159 00160 private: 00161 class CondVarTimeout; 00162 class CondVarCallbackTimeout; 00163 friend class SchedulerTest; 00164 00165 typedef std::set<Alarm*, CompareAlarms> AlarmSet; 00166 00167 int64 RunAlarms(bool* ran_alarms); 00169 void AddAlarmMutexHeld(int64 wakeup_time_us, Alarm* alarm); 00170 void CancelWaiting(Alarm* alarm); 00171 bool NoPendingAlarms(); 00172 00173 ThreadSystem* thread_system_; 00174 Timer* timer_; 00175 scoped_ptr<ThreadSystem::CondvarCapableMutex> mutex_; 00178 scoped_ptr<ThreadSystem::Condvar> condvar_; 00179 uint32 index_; 00180 AlarmSet outstanding_alarms_; 00181 00182 00183 int64 signal_count_; 00184 AlarmSet waiting_alarms_; 00185 bool running_waiting_alarms_; 00186 00187 DISALLOW_COPY_AND_ASSIGN(Scheduler); 00188 }; 00189 00196 class SchedulerBlockingFunction : public Function { 00197 public: 00198 explicit SchedulerBlockingFunction(Scheduler* scheduler); 00199 virtual ~SchedulerBlockingFunction(); 00200 virtual void Run(); 00201 virtual void Cancel(); 00203 bool Block(); 00204 private: 00205 Scheduler* scheduler_; 00206 bool success_; 00207 AtomicBool done_; 00208 DISALLOW_COPY_AND_ASSIGN(SchedulerBlockingFunction); 00209 }; 00210 00211 } 00212 00213 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_SCHEDULER_H_