Support multiple on_change callbacks in subprocess

Also, refactor to not require an EventLoop object.

Change-Id: I346d9cee1fe60e8ade8e527c09df031aa3c3cc39
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/starter/subprocess.h b/aos/starter/subprocess.h
index 60732c3..ff62117 100644
--- a/aos/starter/subprocess.h
+++ b/aos/starter/subprocess.h
@@ -21,14 +21,19 @@
  public:
   SignalListener(aos::ShmEventLoop *loop,
                  std::function<void(signalfd_siginfo)> callback);
+  SignalListener(aos::internal::EPoll *epoll,
+                 std::function<void(signalfd_siginfo)> callback);
   SignalListener(aos::ShmEventLoop *loop,
                  std::function<void(signalfd_siginfo)> callback,
                  std::initializer_list<unsigned int> signals);
+  SignalListener(aos::internal::EPoll *epoll,
+                 std::function<void(signalfd_siginfo)> callback,
+                 std::initializer_list<unsigned int> signals);
 
   ~SignalListener();
 
  private:
-  aos::ShmEventLoop *loop_;
+  aos::internal::EPoll *epoll_;
   std::function<void(signalfd_siginfo)> callback_;
   aos::ipc_lib::SignalFd signalfd_;
 
@@ -91,6 +96,13 @@
 
   void Terminate();
 
+  // Adds a callback which gets notified when the application changes state.
+  // This is in addition to any existing callbacks and doesn't replace any of
+  // them.
+  void AddOnChange(std::function<void()> fn) {
+    on_change_.emplace_back(std::move(fn));
+  }
+
   void set_args(std::vector<std::string> args);
   void set_capture_stdout(bool capture);
   void set_capture_stderr(bool capture);
@@ -127,6 +139,8 @@
 
   void QueueStart();
 
+  void OnChange();
+
   // Copy flatbuffer vector of strings to vector of std::string.
   static std::vector<std::string> FbsVectorToVector(
       const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> &v);
@@ -178,7 +192,7 @@
   aos::TimerHandler *start_timer_, *restart_timer_, *stop_timer_, *pipe_timer_,
       *child_status_handler_;
 
-  std::function<void()> on_change_;
+  std::vector<std::function<void()>> on_change_;
 
   std::unique_ptr<MemoryCGroup> memory_cgroup_;