This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 80079f35e456709b5c6455a369667c5efd21b85d
Author: ligd <[email protected]>
AuthorDate: Fri Nov 24 18:32:06 2023 +0800

    signal: add sig_tgkill() kenrnel version support
    
    Signed-off-by: ligd <[email protected]>
---
 include/nuttx/signal.h    | 30 ++++++++++++++++++++++++++
 sched/signal/sig_tgkill.c | 54 +++++++++++++++++++++++++++++++++++++----------
 2 files changed, 73 insertions(+), 11 deletions(-)

diff --git a/include/nuttx/signal.h b/include/nuttx/signal.h
index ada5eaa1c5..5a1dd4751e 100644
--- a/include/nuttx/signal.h
+++ b/include/nuttx/signal.h
@@ -413,6 +413,36 @@ int nxsig_queue(int pid, int signo, union sigval value);
 
 int nxsig_kill(pid_t pid, int signo);
 
+/****************************************************************************
+ * Name: nxsig_tgkill
+ *
+ * Description:
+ *   The tgkill() system call can be used to send any signal to a thread.
+ *   See kill() for further information as this is just a simple wrapper
+ *   around the kill() function.
+ *
+ * Input Parameters:
+ *   gid   - The id of the task to receive the signal.
+ *   tid   - The id of the thread to receive the signal. Only positive,
+ *           non-zero values of 'tid' are supported.
+ *   signo - The signal number to send.  If 'signo' is zero, no signal is
+ *           sent, but all error checking is performed.
+ *
+ * Returned Value:
+ *    On success the signal was send and zero is returned. On error -1 is
+ *    returned, and errno is set one of the following error numbers:
+ *
+ *    EINVAL An invalid signal was specified.
+ *    EPERM  The thread does not have permission to send the
+ *           signal to the target thread.
+ *    ESRCH  No thread could be found corresponding to that
+ *           specified by the given thread ID
+ *    ENOSYS Do not support sending signals to process groups.
+ *
+ ****************************************************************************/
+
+int nxsig_tgkill(pid_t pid, pid_t tid, int signo);
+
 /****************************************************************************
  * Name: nxsig_waitinfo
  *
diff --git a/sched/signal/sig_tgkill.c b/sched/signal/sig_tgkill.c
index 556f14622f..3f46012755 100644
--- a/sched/signal/sig_tgkill.c
+++ b/sched/signal/sig_tgkill.c
@@ -40,7 +40,7 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Name: tgkill
+ * Name: nxsig_tgkill
  *
  * Description:
  *   The tgkill() system call can be used to send any signal to a thread.
@@ -67,9 +67,8 @@
  *
  ****************************************************************************/
 
-int tgkill(pid_t pid, pid_t tid, int signo)
+int nxsig_tgkill(pid_t pid, pid_t tid, int signo)
 {
-#ifdef HAVE_GROUP_MEMBERS
   /* If group members are supported then tgkill() differs from kill().
    * kill(), in this case, must follow the POSIX rules for delivery of
    * signals in the group environment.  Otherwise, kill(), like tgkill()
@@ -125,14 +124,47 @@ int tgkill(pid_t pid, pid_t tid, int signo)
   return OK;
 
 errout:
-  set_errno(-ret);
-  return ERROR;
+  return ret;
+}
 
-#else
-  /* If group members are not supported then tgkill is basically the
-   * same as kill() other than the sign of the returned value.
-   */
+/****************************************************************************
+ * Name: tgkill
+ *
+ * Description:
+ *   The tgkill() system call can be used to send any signal to a thread.
+ *   See kill() for further information as this is just a simple wrapper
+ *   around the kill() function.
+ *
+ * Input Parameters:
+ *   gid   - The id of the task to receive the signal.
+ *   tid   - The id of the thread to receive the signal. Only positive,
+ *           non-zero values of 'tid' are supported.
+ *   signo - The signal number to send.  If 'signo' is zero, no signal is
+ *           sent, but all error checking is performed.
+ *
+ * Returned Value:
+ *    On success the signal was send and zero is returned. On error -1 is
+ *    returned, and errno is set one of the following error numbers:
+ *
+ *    EINVAL An invalid signal was specified.
+ *    EPERM  The thread does not have permission to send the
+ *           signal to the target thread.
+ *    ESRCH  No thread could be found corresponding to that
+ *           specified by the given thread ID
+ *    ENOSYS Do not support sending signals to process groups.
+ *
+ ****************************************************************************/
 
-  return kill(tid, signo);
-#endif
+int tgkill(pid_t pid, pid_t tid, int signo)
+{
+  int ret;
+
+  ret = nxsig_tgkill(pid, tid, signo);
+  if (ret < 0)
+    {
+      set_errno(-ret);
+      ret = ERROR;
+    }
+
+  return ret;
 }

Reply via email to