/// \file procs.h
/// Contains generic function headers for managing processes.

#pragma once
#include "tinythread.h"
#include <deque>
#include <set>
#include <string>
#include <unistd.h>
#include <vector>
#include <stdint.h> 

/// Contains utility code, not directly related to streaming media
namespace Util{

  /// Deals with spawning, monitoring and stopping child processes
  class Procs{
  private:
    static tthread::mutex plistMutex;
    static std::set<pid_t> plist; ///< Holds active process list.
    static bool thread_handler;   ///< True while thread handler should be running.
    static void childsig_handler(int signum);
    static void exit_handler();
    static char *const *dequeToArgv(std::deque<std::string> &argDeq);
    static void grim_reaper(void *n);
  public:
    static bool childRunning(pid_t p);
    static tthread::thread *reaper_thread;
    static bool handler_set; ///< If true, the sigchld handler has been setup.
    static void fork_prepare();
    static void fork_complete();
    static void setHandler();
    static std::string getOutputOf(char *const *argv, uint64_t maxWait = 0);
    static std::string getOutputOf(std::deque<std::string> &argDeq, uint64_t maxWait = 0);
    static std::string getLimitedOutputOf(char *const *argv, uint64_t maxWait, uint32_t maxValBytes);
    static pid_t StartPiped(const char *const *argv, int *fdin, int *fdout, int *fderr);
    static pid_t StartPiped(std::deque<std::string> &argDeq, int *fdin, int *fdout, int *fderr);
    static void Stop(pid_t name);
    static void Murder(pid_t name);
    static void StopAll();
    static int Count();
    static bool isActive(pid_t name);
    static bool isRunning(pid_t pid);
    static void forget(pid_t pid);
    static void remember(pid_t pid);
    static std::set<int> socketList; ///< Holds sockets that should be closed before forking
    static int kill_timeout;
  };
}// namespace Util