Home | History | Annotate | Download | only in drive
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_JOB_QUEUE_H_
      6 #define CHROME_BROWSER_CHROMEOS_DRIVE_JOB_QUEUE_H_
      7 
      8 #include <deque>
      9 #include <set>
     10 #include <vector>
     11 
     12 #include "chrome/browser/chromeos/drive/job_list.h"
     13 
     14 namespace drive {
     15 
     16 // Priority queue for managing jobs in JobScheduler.
     17 class JobQueue {
     18  public:
     19   // Creates a queue that allows |num_max_concurrent_jobs| concurrent job
     20   // execution and has |num_priority_levels| levels of priority.
     21   JobQueue(size_t num_max_concurrent_jobs, size_t num_priority_levels);
     22   ~JobQueue();
     23 
     24   // Pushes a job |id| of |priority|. The job with the smallest priority value
     25   // is popped first (lower values are higher priority). In the same priority,
     26   // the queue is "first-in first-out".
     27   void Push(JobID id, int priority);
     28 
     29   // Pops the first job which meets |accepted_priority| (i.e. the first job in
     30   // the queue with equal or higher priority (lower value)), and the limit of
     31   // concurrent job count is satisfied.
     32   //
     33   // For instance, if |accepted_priority| is 1, the first job with priority 0
     34   // (higher priority) in the queue is picked even if a job with priority 1 was
     35   // pushed earlier. If there is no job with priority 0, the first job with
     36   // priority 1 in the queue is picked.
     37   bool PopForRun(int accepted_priority, JobID* id);
     38 
     39   // Gets queued jobs with the given priority.
     40   void GetQueuedJobs(int priority, std::vector<JobID>* jobs) const;
     41 
     42   // Marks a running job |id| as finished running. This decreases the count
     43   // of running parallel jobs and makes room for other jobs to be popped.
     44   void MarkFinished(JobID id);
     45 
     46   // Generates a string representing the internal state for logging.
     47   std::string ToString() const;
     48 
     49   // Gets the total number of jobs in the queue.
     50   size_t GetNumberOfJobs() const;
     51 
     52   // Removes the job from the queue.
     53   void Remove(JobID id);
     54 
     55  private:
     56   size_t num_max_concurrent_jobs_;
     57   std::vector<std::deque<JobID> > queue_;
     58   std::set<JobID> running_;
     59 
     60   DISALLOW_COPY_AND_ASSIGN(JobQueue);
     61 };
     62 
     63 }  // namespace drive
     64 
     65 #endif  // CHROME_BROWSER_CHROMEOS_DRIVE_JOB_QUEUE_H_
     66