signal.hpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #pragma once
  2. #include <map>
  3. #include <list>
  4. #include <signal.h>
  5. #include <stdint.h>
  6. #include <types/types.h>
  7. #include <types/cplusplus.hpp>
  8. namespace kernel {
  9. using sigmask_type = uint64_t;
  10. struct sigaction {
  11. sighandler_t sa_handler;
  12. unsigned long sa_flags;
  13. sigrestorer_t sa_restorer;
  14. sigmask_type sa_mask;
  15. };
  16. class signal_list {
  17. public:
  18. using signo_type = uint32_t;
  19. using list_type = std::list<signo_type>;
  20. private:
  21. list_type m_list;
  22. sigmask_type m_mask { };
  23. std::map<signo_type, sigaction> m_handlers;
  24. public:
  25. static constexpr bool check_valid(signo_type sig)
  26. {
  27. return sig >= 1 && sig <= 64;
  28. }
  29. public:
  30. constexpr signal_list() = default;
  31. constexpr signal_list(const signal_list& val) = default;
  32. constexpr signal_list(signal_list&& val) = default;
  33. void on_exec();
  34. sigmask_type get_mask() const;
  35. void set_mask(sigmask_type mask);
  36. void mask(sigmask_type mask);
  37. void unmask(sigmask_type mask);
  38. void set_handler(signo_type signal, const sigaction& action);
  39. void get_handler(signo_type signal, sigaction& action) const;
  40. constexpr bool empty(void) const { return m_list.empty(); }
  41. void raise(signo_type signal);
  42. signo_type handle();
  43. void after_signal(signo_type signal);
  44. };
  45. } // namespace kernel