signal.hpp 1.2 KB

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