signal.hpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. #include <list>
  3. #include <stdint.h>
  4. #include <types/cplusplus.hpp>
  5. namespace kernel {
  6. using sig_t = uint32_t;
  7. constexpr sig_t SIGINT = 2;
  8. constexpr sig_t SIGQUIT = 3;
  9. constexpr sig_t SIGSTOP = 13;
  10. constexpr sig_t SIGPIPE = 19;
  11. class signal_list {
  12. public:
  13. using list_type = std::list<sig_t>;
  14. private:
  15. list_type m_list;
  16. sig_t m_mask;
  17. public:
  18. static constexpr bool check_valid(sig_t sig)
  19. {
  20. switch (sig) {
  21. case SIGINT:
  22. case SIGQUIT:
  23. case SIGSTOP:
  24. case SIGPIPE:
  25. return true;
  26. default:
  27. return false;
  28. }
  29. }
  30. public:
  31. constexpr signal_list(void)
  32. : m_mask(0)
  33. {
  34. }
  35. constexpr signal_list(const signal_list& val)
  36. : m_list(val.m_list)
  37. , m_mask(val.m_mask)
  38. {
  39. }
  40. constexpr signal_list(signal_list&& val)
  41. : m_list(std::move(val.m_list))
  42. , m_mask(val.m_mask)
  43. {
  44. }
  45. constexpr bool empty(void) const
  46. {
  47. return this->m_list.empty();
  48. }
  49. constexpr void set(sig_t signal)
  50. {
  51. if (this->m_mask && signal)
  52. return;
  53. this->m_list.push_back(signal);
  54. this->m_mask |= signal;
  55. }
  56. constexpr sig_t pop(void)
  57. {
  58. if (this->empty())
  59. return 0;
  60. auto iter = this->m_list.begin();
  61. sig_t signal = *iter;
  62. this->m_list.erase(iter);
  63. this->m_mask &= ~signal;
  64. return signal;
  65. }
  66. };
  67. } // namespace kernel