You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2020/07/02 02:52:28 UTC
[incubator-nuttx] branch master updated: syscall/prctl: fix
PR_SET_NAME failure if without arg
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/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 3fbdc21 syscall/prctl: fix PR_SET_NAME failure if without <pid> arg
3fbdc21 is described below
commit 3fbdc213b79474b1dfb9ad7580b348569c23361d
Author: chao.an <an...@xiaomi.com>
AuthorDate: Tue Jun 30 19:32:41 2020 +0800
syscall/prctl: fix PR_SET_NAME failure if without <pid> arg
add PR_SET_NAME_EXT/PR_GET_NAME_EXT extension to avoid semantic
conflicts, use extened version for pthread_setname_np/pthread_getname_np
Change-Id: I40404c737977a623130dcd37feb4061b5526e466
Signed-off-by: chao.an <an...@xiaomi.com>
---
include/pthread.h | 4 ++--
include/sys/prctl.h | 37 +++++++++++++++++++++++++++++--------
sched/task/task_prctl.c | 12 ++++++++++--
3 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/include/pthread.h b/include/pthread.h
index 70b188e..6ff5cd8 100644
--- a/include/pthread.h
+++ b/include/pthread.h
@@ -207,10 +207,10 @@
*/
#define pthread_setname_np(thread, name) \
- prctl((int)PR_SET_NAME, (char*)name, (int)thread)
+ prctl((int)PR_SET_NAME_EXT, (char*)name, (int)thread)
#define pthread_getname_np(thread, name) \
- prctl((int)PR_GET_NAME, (char*)name, (int)thread)
+ prctl((int)PR_GET_NAME_EXT, (char*)name, (int)thread)
/********************************************************************************
* Public Type Definitions
diff --git a/include/sys/prctl.h b/include/sys/prctl.h
index 44cf20b..678fbbf 100644
--- a/include/sys/prctl.h
+++ b/include/sys/prctl.h
@@ -47,26 +47,47 @@
/* Supported prctl() commands.
*
* PR_SET_NAME
+ * Set the name of the calling thread, using the value in the location
+ * pointed to by (char *) arg2. The name can be up to
+ * CONFIG_TASK_NAME_SIZE long, including the terminating null byte.
+ * (If the length of the string, including the terminating null byte,
+ * exceeds CONFIG_TASK_NAME_SIZE bytes, the string is silently truncated.)
+ * As an example:
+ *
+ * prctl(PR_SET_NAME, "MyName");
+ *
+ * PR_GET_NAME
+ * Return the name of the calling thread, in the buffer pointed to by
+ * (char *) arg2. The buffer should allow space for up to
+ * CONFIG_TASK_NAME_SIZE bytes; the returned string will be
+ * null-terminated. As an example:
+ *
+ * char myname[CONFIG_TASK_NAME_SIZE];
+ * prctl(PR_GET_NAME, myname);
+ *
+ * PR_SET_NAME_EXT
* Set the task (or thread) name for the thread whose ID is in required
* arg2 (int), using the value in the location pointed to by required arg1
* (char*). The name can be up to CONFIG_TASK_NAME_SIZE long (including
* any null termination). The thread ID of 0 will set the name of the
* calling thread. As an example:
*
- * prctl(PR_SET_NAME, "MyName", 0);
+ * prctl(PR_SET_NAME_EXT, "MyName", pid);
*
- * PR_GET_NAME
+ * PR_GET_NAME_EXT
* Return the task (or thread) name for the for the thread whose ID is
- * optional arg2 (int), in the buffer pointed to by optional arg1 (char *).
- * The buffer must be CONFIG_TASK_NAME_SIZE long (including any null
- * termination). As an example:
+ * optional arg2 (int), in the buffer pointed to by optional arg1
+ * (char *). The buffer must be CONFIG_TASK_NAME_SIZE long (including
+ * any null termination). As an example:
*
* char myname[CONFIG_TASK_NAME_SIZE];
- * prctl(PR_GET_NAME, myname, 0);
+ * prctl(PR_GET_NAME_EXT, myname, pid);
*/
-#define PR_SET_NAME 1
-#define PR_GET_NAME 2
+#define PR_SET_NAME 1
+#define PR_GET_NAME 2
+#define PR_SET_NAME_EXT 3
+#define PR_GET_NAME_EXT 4
/****************************************************************************
* Public Type Definitions
diff --git a/sched/task/task_prctl.c b/sched/task/task_prctl.c
index 8afbe1d..b237098 100644
--- a/sched/task/task_prctl.c
+++ b/sched/task/task_prctl.c
@@ -84,13 +84,21 @@ int prctl(int option, ...)
{
case PR_SET_NAME:
case PR_GET_NAME:
+ case PR_SET_NAME_EXT:
+ case PR_GET_NAME_EXT:
#if CONFIG_TASK_NAME_SIZE > 0
{
/* Get the prctl arguments */
FAR char *name = va_arg(ap, FAR char *);
- int pid = va_arg(ap, int);
FAR struct tcb_s *tcb;
+ int pid = 0;
+
+ if (option == PR_SET_NAME_EXT ||
+ option == PR_GET_NAME_EXT)
+ {
+ pid = va_arg(ap, int);
+ }
/* Get the TCB associated with the PID (handling the special case
* of pid==0 meaning "this thread")
@@ -127,7 +135,7 @@ int prctl(int option, ...)
/* Now get or set the task name */
- if (option == PR_SET_NAME)
+ if (option == PR_SET_NAME || option == PR_SET_NAME_EXT)
{
/* Ensure that tcb->name will be null-terminated, truncating if
* necessary.