lwp_signal.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-02-23 Jesven first version.
  9. * 2023-07-06 Shell update the generation, pending and delivery API
  10. */
  11. #ifndef __LWP_SIGNAL_H__
  12. #define __LWP_SIGNAL_H__
  13. #include "syscall_generic.h"
  14. #include <rtthread.h>
  15. #include <sys/signal.h>
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif
  19. #define _USIGNAL_SIGMASK(signo) (1u << ((signo)-1))
  20. #define LWP_SIG_IGNORE_SET (_USIGNAL_SIGMASK(SIGCHLD) | _USIGNAL_SIGMASK(SIGURG))
  21. #define LWP_SIG_ACT_DFL ((lwp_sighandler_t)0)
  22. #define LWP_SIG_ACT_IGN ((lwp_sighandler_t)1)
  23. #define LWP_SIG_USER_SA_FLAGS \
  24. (SA_NOCLDSTOP | SA_NOCLDWAIT | SA_SIGINFO | SA_ONSTACK | SA_RESTART | \
  25. SA_NODEFER | SA_RESETHAND | SA_EXPOSE_TAGBITS)
  26. typedef enum {
  27. LWP_SIG_MASK_CMD_BLOCK,
  28. LWP_SIG_MASK_CMD_UNBLOCK,
  29. LWP_SIG_MASK_CMD_SET_MASK,
  30. __LWP_SIG_MASK_CMD_WATERMARK
  31. } lwp_sig_mask_cmd_t;
  32. /**
  33. * LwP implementation of POSIX signal
  34. */
  35. struct lwp_signal {
  36. struct rt_mutex sig_lock;
  37. struct lwp_sigqueue sig_queue;
  38. rt_thread_t sig_dispatch_thr[_LWP_NSIG];
  39. lwp_sighandler_t sig_action[_LWP_NSIG];
  40. lwp_sigset_t sig_action_mask[_LWP_NSIG];
  41. lwp_sigset_t sig_action_nodefer;
  42. lwp_sigset_t sig_action_onstack;
  43. lwp_sigset_t sig_action_restart;
  44. lwp_sigset_t sig_action_siginfo;
  45. };
  46. struct rt_lwp;
  47. #ifndef ARCH_MM_MMU
  48. void lwp_sighandler_set(int sig, lwp_sighandler_t func);
  49. void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func);
  50. #endif
  51. rt_inline void lwp_sigqueue_init(lwp_sigqueue_t sigq)
  52. {
  53. rt_memset(&sigq->sigset_pending, 0, sizeof(lwp_sigset_t));
  54. rt_list_init(&sigq->siginfo_list);
  55. }
  56. /**
  57. * @brief release the signal queue
  58. *
  59. * @param sigq target signal queue
  60. */
  61. void lwp_sigqueue_clear(lwp_sigqueue_t sigq);
  62. rt_err_t lwp_signal_init(struct lwp_signal *sig);
  63. rt_err_t lwp_signal_detach(struct lwp_signal *signal);
  64. rt_inline void lwp_thread_signal_detach(struct lwp_thread_signal *tsig)
  65. {
  66. lwp_sigqueue_clear(&tsig->sig_queue);
  67. }
  68. /**
  69. * @brief send a signal to the process
  70. *
  71. * @param lwp the process to be killed
  72. * @param signo the signal number
  73. * @param code as in siginfo
  74. * @param value as in siginfo
  75. * @return rt_err_t RT_EINVAL if the parameter is invalid, RT_EOK as successful
  76. *
  77. * @note the *signal_kill have the same definition of a successful return as
  78. * kill() in IEEE Std 1003.1-2017
  79. */
  80. rt_err_t lwp_signal_kill(struct rt_lwp *lwp, long signo, long code, long value);
  81. /**
  82. * @brief set or examine the signal action of signo
  83. *
  84. * @param signo signal number
  85. * @param act the signal action
  86. * @param oact the old signal action
  87. * @return rt_err_t
  88. */
  89. rt_err_t lwp_signal_action(struct rt_lwp *lwp, int signo,
  90. const struct lwp_sigaction *restrict act,
  91. struct lwp_sigaction *restrict oact);
  92. /**
  93. * @brief send a signal to the thread
  94. *
  95. * @param thread target thread
  96. * @param signo the signal number
  97. * @param code as in siginfo
  98. * @param value as in siginfo
  99. * @return rt_err_t RT_EINVAL if the parameter is invalid, RT_EOK as successful
  100. */
  101. rt_err_t lwp_thread_signal_kill(rt_thread_t thread, long signo, long code, long value);
  102. /**
  103. * @brief set signal mask of target thread
  104. *
  105. * @param thread the target thread
  106. * @param how command
  107. * @param sigset operand
  108. * @param oset the address to old set
  109. * @return rt_err_t
  110. */
  111. rt_err_t lwp_thread_signal_mask(rt_thread_t thread, lwp_sig_mask_cmd_t how,
  112. const lwp_sigset_t *sigset, lwp_sigset_t *oset);
  113. /**
  114. * @brief Catch signal if exists and no return, otherwise return with no side effect
  115. *
  116. * @param exp_frame the exception frame on kernel stack
  117. */
  118. void lwp_thread_signal_catch(void *exp_frame);
  119. /**
  120. * @brief Check if it's okay to suspend for current lwp thread
  121. *
  122. * @param thread target thread
  123. * @param suspend_flag suspend flag of target thread
  124. * @return int 1 if can be suspended, otherwise not
  125. */
  126. int lwp_thread_signal_suspend_check(rt_thread_t thread, int suspend_flag);
  127. /**
  128. * @brief Asynchronously wait for signal
  129. *
  130. * @param thread target thread
  131. * @param sigset the signals to be waited
  132. * @param info address of user siginfo
  133. * @param timeout timeout of waiting
  134. * @return rt_err_t
  135. */
  136. rt_err_t lwp_thread_signal_timedwait(rt_thread_t thread, lwp_sigset_t *sigset,
  137. siginfo_t *usi, struct timespec *timeout);
  138. /**
  139. * @brief Examine the set of signals that are blocked from delivery to the
  140. * calling thread and that are pending on the process or the calling thread
  141. *
  142. * @param thread target thread
  143. * @param sigset where mask of pending signals is returned
  144. */
  145. void lwp_thread_signal_pending(rt_thread_t thread, lwp_sigset_t *sigset);
  146. #ifdef __cplusplus
  147. }
  148. #endif
  149. #endif /* __LWP_SIGNAL_H__ */