libutil++  1.9.3
 All Classes Functions Variables
TaskQueue.h
1 /*
2 ** libutil++
3 ** $Id: TaskQueue.h 1653 2016-02-28 19:54:59Z sella $
4 ** Copyright (c) 2011-2016 Digital Genesis, LLC. All Rights Reserved.
5 ** Released under the LGPL Version 2.1 License.
6 ** http://www.digitalgenesis.com
7 */
8 
9 #ifndef __libutilxx__sella__util__TaskQueue_H__
10 #define __libutilxx__sella__util__TaskQueue_H__
11 
12 #include "../../common.h"
13 #include "Task.h"
14 #include "Log.h"
15 
16 #include <vector>
17 #include <chrono>
18 
19 namespace sella {
20  namespace util {
21  class TaskQueue;
22  static const timeval FallbackTimeval = { 0, 200000 }; /* 200ms */
23  }
24 }
25 
26 class sella::util::TaskQueue { /* NOTE: TaskQueue is not natively thread safe. Add your own locking if needed. */
27  public:
28  typedef std::shared_ptr<TaskQueue> shared;
29 
30  public:
31  static const size_t DefaultMinimumCapacity = 16;
32 
33  static const uint64_t FallbackMsecDelay = 200;
34  static const uint64_t FallbackUsecDelay = 200000;
35 
36  public:
37  TaskQueue(const size_t capacity = DefaultMinimumCapacity);
38  TaskQueue(Log::shared log, const size_t capacity = DefaultMinimumCapacity);
39  TaskQueue(const TaskQueue &other) = delete;
40  virtual ~TaskQueue();
41  TaskQueue& operator=(const TaskQueue &other) = delete;
42 
43  size_t size(void) const;
44  bool empty(void) const;
45  void clear(void);
46 
47  Task::shared top(void) const;
48  Task::shared next(void) const;
49 
50  const timeval getDelay(timeval fallback = FallbackTimeval) const;
51  uint64_t getDelayMsec(uint64_t fallback = FallbackMsecDelay, uint64_t maximum = 0) const;
52  uint64_t getDelayUsec(uint64_t fallback = FallbackUsecDelay, uint64_t maximum = 0) const;
53 
54  void push(Task::shared &task);
55  void push(Task::shared &task, const std::chrono::system_clock::duration &delay, int priority = 0);
56  void push(Task::shared &task, const std::chrono::system_clock::time_point &time, int priority = 0);
57  void push(Task::shared &task, time_t sec, suseconds_t usec = 0, int priority = 0);
58  void push(Task::shared &task, timeval &tv, int priority = 0);
59  bool repush(Task::shared &task, const std::chrono::system_clock::duration &delay, int priority = 0, bool strict = false);
60  bool repush(Task::shared &task, const std::chrono::system_clock::time_point &time, int priority = 0, bool strict = false);
61  bool repush(Task::shared &task, time_t sec, suseconds_t usec = 0, int priority = 0, bool strict = false);
62  bool repush(Task::shared &task, timeval &tv, int priority = 0, bool strict = false);
63  void pop(void);
64  bool erase(Task::shared &task, bool firstonly = true);
65  bool erase(void *object);
66 
67  size_t capacity(void) const;
68  void reserve(size_t capacity);
69  void print(void) const;
70  void setLog(Log::shared log);
71 
72  bool isReady(void) const;
73 
74  protected:
75  Log::shared libutilxx__log;
76  std::vector<Task::shared> heap;
77 };
78 
79 #endif
80 
81 /*
82 ** vim: noet ts=3 sw=3
83 */