signal.hpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #pragma once
  2. #include <list>
  3. #include <map>
  4. #include <signal.h>
  5. #include <stdint.h>
  6. #include <types/cplusplus.hpp>
  7. #include <types/types.h>
  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. return sig >= 1 && sig <= 64;
  30. }
  31. public:
  32. constexpr signal_list() = default;
  33. constexpr signal_list(const signal_list& val)
  34. : m_list{val.m_list}
  35. , m_mask{val.m_mask}
  36. , m_handlers{val.m_handlers}
  37. , m_mtx{} {}
  38. constexpr signal_list(signal_list&& val)
  39. : m_list{std::move(val.m_list)}
  40. , m_mask{std::move(val.m_mask)}
  41. , m_handlers{std::move(val.m_handlers)}
  42. , m_mtx{} {}
  43. void on_exec();
  44. sigmask_type get_mask() const;
  45. void set_mask(sigmask_type mask);
  46. void mask(sigmask_type mask);
  47. void unmask(sigmask_type mask);
  48. void set_handler(signo_type signal, const sigaction& action);
  49. void get_handler(signo_type signal, sigaction& action) const;
  50. signo_type pending_signal();
  51. // return value: whether the thread should wake up
  52. bool raise(signo_type signal);
  53. void handle(interrupt_stack* context, mmx_registers* mmxregs);
  54. void after_signal(signo_type signal);
  55. };
  56. } // namespace kernel