signal.hpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. class signal_list {
  11. public:
  12. using list_type = types::list<sig_t>;
  13. private:
  14. list_type m_list;
  15. sig_t m_mask;
  16. public:
  17. constexpr signal_list(void)
  18. : m_mask(0)
  19. {
  20. }
  21. constexpr signal_list(const signal_list& val)
  22. : m_list(val.m_list)
  23. , m_mask(val.m_mask)
  24. {
  25. }
  26. constexpr signal_list(signal_list&& val)
  27. : m_list(types::move(val.m_list))
  28. , m_mask(val.m_mask)
  29. {
  30. }
  31. constexpr bool empty(void) const
  32. {
  33. return this->m_list.empty();
  34. }
  35. constexpr void set(sig_t signal)
  36. {
  37. if (this->m_mask && signal)
  38. return;
  39. this->m_list.push_back(signal);
  40. this->m_mask |= signal;
  41. }
  42. constexpr sig_t pop(void)
  43. {
  44. if (this->empty())
  45. return 0;
  46. auto iter = this->m_list.begin();
  47. sig_t signal = *iter;
  48. this->m_list.erase(iter);
  49. this->m_mask &= ~signal;
  50. return signal;
  51. }
  52. };
  53. } // namespace kernel