Page Speed Optimization Libraries  1.2.24.1
net/instaweb/util/public/scheduler.h
Go to the documentation of this file.
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines