Page Speed Optimization Libraries  1.4.26.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 
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines