OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
instance_task.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Juniper Networks, Inc. All right reserved.
3  */
4 #ifndef AGENT_OPER_INSTANCE_TASK_H__
5 #define AGENT_OPER_INSTANCE_TASK_H__
6 
7 #include <queue>
8 #include <boost/asio.hpp>
9 #include <boost/function.hpp>
10 #include "base/timer.h"
11 #include "base/queue_task.h"
12 #include "cmn/agent_signal.h"
13 #include "cmn/agent_cmn.h"
14 #include "db/db_entry.h"
15 
16 class EventManager;
17 
18 class InstanceTask {
19  public:
20  typedef boost::function<void(InstanceTask *task, const std::string &msg)>
22  typedef boost::function<void(InstanceTask *task,
23  const boost::system::error_code &ec)>OnExitCallback;
24 
25  InstanceTask();
26  virtual ~InstanceTask() {}
27 
28  virtual bool Run() = 0;
29  virtual void Stop() = 0;
30  virtual void Terminate() = 0;
31  virtual bool IsSetup() = 0;
32 
33  // TODO reimplement instance_manager.cc to remove these two?
34  virtual pid_t pid() const = 0;
35  virtual const std::string &cmd() const = 0;
36 
37  virtual int cmd_type() const = 0;
38 
39  bool is_running() const {
40  return is_running_;
41  }
42 
43  time_t start_time() const {
44  return start_time_;
45  }
46 
48  on_data_cb_ = cb;
49  }
50 
52  on_exit_cb_ = cb;
53  }
54 
56  return ++reattempts_;
57  }
58 
59  int reattempts() {
60  return reattempts_;
61  }
62 
63  protected:
65  time_t start_time_;
69 };
70 
72  public:
73  static const size_t kBufLen = 4096;
74 
75  InstanceTaskExecvp(const std::string &name, const std::string &cmd,
76  int cmd_type, EventManager *evm);
77 
78  bool Run();
79  void Stop();
80  void Terminate();
81  bool IsSetup();
82 
83  pid_t pid() const {
84  return pid_;
85  }
86 
87  void set_cmd(std::string cmd) {
88  cmd_ = cmd;
89  }
90 
91  const std::string &cmd() const {
92  return cmd_;
93  }
94 
95  int cmd_type() const {
96  return cmd_type_;
97  }
98 
99  void set_pipe_stdout(bool pipe) {
100  pipe_stdout_ = pipe;
101  }
102 
103 
104  private:
105  void ReadData(const boost::system::error_code &ec, size_t read_bytes);
106 
107  const std::string name_;
108  std::string cmd_;
109  boost::asio::posix::stream_descriptor input_;
110  bool setup_done_; // indicates whether errors_ has a valid descriptor or not
112 
113  pid_t pid_;
116 };
117 
119  public:
120  pid_t pid() const {
121  return 0;
122  }
123 };
124 
126 public:
127  typedef boost::function<void(InstanceTaskQueue *task_queue)> OnTimeoutCallback;
130 
131  bool OnTimerTimeout();
132  void TimerErrorHandler(const std::string &name, std::string error);
133 
134  InstanceTask *Front() { return task_queue_.front(); }
135  void Pop() { task_queue_.pop(); }
136  bool Empty() { return task_queue_.empty(); }
137  void Push(InstanceTask *task) { task_queue_.push(task); }
138  int Size() { return task_queue_.size(); }
139  void StartTimer(int time);
140  void StopTimer();
141  void Clear();
142 
144  on_timeout_cb_ = cb;
145  }
146 
147 private:
150  std::queue<InstanceTask *> task_queue_;
152 };
153 
154 #endif // AGENT_OPER_INSTANCE_TASK_H__
static const size_t kBufLen
Definition: instance_task.h:73
time_t start_time() const
Definition: instance_task.h:43
int reattempts()
Definition: instance_task.h:59
InstanceTask * Front()
void set_on_data_cb(OnDataCallback cb)
Definition: instance_task.h:47
void Push(InstanceTask *task)
int incr_reattempts()
Definition: instance_task.h:55
Definition: task_int.h:10
virtual int cmd_type() const =0
bool is_running() const
Definition: instance_task.h:39
void set_on_timeout_cb(OnTimeoutCallback cb)
virtual pid_t pid() const =0
void TimerErrorHandler(const std::string &name, std::string error)
OnDataCallback on_data_cb_
Definition: instance_task.h:67
boost::function< void(InstanceTask *task, const std::string &msg)> OnDataCallback
Definition: instance_task.h:21
boost::function< void(InstanceTask *task, const boost::system::error_code &ec)> OnExitCallback
Definition: instance_task.h:23
EventManager * evm_
void set_cmd(std::string cmd)
Definition: instance_task.h:87
pid_t pid() const
Definition: instance_task.h:83
boost::asio::posix::stream_descriptor input_
void StartTimer(int time)
const std::string name_
OnTimeoutCallback on_timeout_cb_
std::queue< InstanceTask * > task_queue_
void set_on_exit_cb(OnExitCallback cb)
Definition: instance_task.h:51
char rx_buff_[kBufLen]
virtual void Terminate()=0
boost::function< void(InstanceTaskQueue *task_queue)> OnTimeoutCallback
virtual ~InstanceTask()
Definition: instance_task.h:26
time_t start_time_
Definition: instance_task.h:65
virtual bool Run()=0
void set_pipe_stdout(bool pipe)
Definition: instance_task.h:99
void ReadData(const boost::system::error_code &ec, size_t read_bytes)
const std::string & cmd() const
Definition: instance_task.h:91
Definition: timer.h:54
pid_t pid() const
virtual const std::string & cmd() const =0
int cmd_type() const
Definition: instance_task.h:95
OnExitCallback on_exit_cb_
Definition: instance_task.h:68
virtual bool IsSetup()=0
static EventManager evm
InstanceTaskExecvp(const std::string &name, const std::string &cmd, int cmd_type, EventManager *evm)
InstanceTaskQueue(EventManager *evm)
virtual void Stop()=0