signal.hpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. #include <kernel/async/lock.hpp>
  9. #include <kernel/interrupt.hpp>
  10. namespace kernel {
  11. using sigmask_type = uint64_t;
  12. struct sigaction {
  13. sighandler_t sa_handler;
  14. unsigned long sa_flags;
  15. sigrestorer_t sa_restorer;
  16. sigmask_type sa_mask;
  17. };
  18. class signal_list {
  19. public:
  20. using signo_type = uint32_t;
  21. using list_type = std::list<signo_type>;
  22. private:
  23. list_type m_list;
  24. sigmask_type m_mask { };
  25. std::map<signo_type, sigaction> m_handlers;
  26. async::mutex m_mtx;
  27. public:
  28. static constexpr bool check_valid(signo_type sig)
  29. {
  30. return sig >= 1 && sig <= 64;
  31. }
  32. public:
  33. constexpr signal_list() = default;
  34. constexpr signal_list(const signal_list& val)
  35. : m_list{val.m_list}, m_mask{val.m_mask}
  36. , m_handlers{val.m_handlers}, m_mtx{} { }
  37. constexpr signal_list(signal_list&& val)
  38. : m_list{std::move(val.m_list)}, m_mask{std::move(val.m_mask)}
  39. , m_handlers{std::move(val.m_handlers)}, m_mtx{} { }
  40. void on_exec();
  41. sigmask_type get_mask() const;
  42. void set_mask(sigmask_type mask);
  43. void mask(sigmask_type mask);
  44. void unmask(sigmask_type mask);
  45. void set_handler(signo_type signal, const sigaction& action);
  46. void get_handler(signo_type signal, sigaction& action) const;
  47. signo_type pending_signal();
  48. // return value: whether the thread should wake up
  49. bool raise(signo_type signal);
  50. void handle(interrupt_stack_normal* context, mmx_registers* mmxregs);
  51. void after_signal(signo_type signal);
  52. };
  53. } // namespace kernel