Write a version for pthread_get_name_np
Yuri Pankov
yuripv at yuripv.net
Mon Aug 13 00:24:10 UTC 2018
Konstantin Belousov wrote:
> On Mon, Aug 13, 2018 at 01:36:28AM +0200, Willem Jan Withagen wrote:
>> On 13/08/2018 00:57, Konstantin Belousov wrote:
>>> On Mon, Aug 13, 2018 at 12:01:03AM +0200, Willem Jan Withagen wrote:
>>>> On 12/08/2018 22:58, Konstantin Belousov wrote:
>>>>> On Sun, Aug 12, 2018 at 10:33:06PM +0200, Willem Jan Withagen wrote:
>>>>>> Hi,
>>>>>>
>>>>>> For some porting I'm trying to write a pthread_get_name_np(), but
>>>>>> I have run into a snag....
>>>>>> Tried some the the procstat code I would come up with:
>>>>>>
>>>>>> int pthread_get_name_np(pthread_t *thread,
>>>>>> char *name, size_t len){
>>>>>> struct procstat *procstat;
>>>>>> int pid = getpid();
>>>>>> unsigned int count, i;
>>>>>> struct kinfo_proc *kip, *kipp;
>>>>>>
>>>>>> procstat = procstat_open_sysctl();
>>>>>> kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
>>>>>> pid, &count);
>>>>>> for (i = 0; i < count; i++) {
>>>>>> kipp = &kip[i];
>>>>>> printf("thread: %ld(0x%lx), %ld(0x%lx)\n", thread, thread,
>>>>>> kipp->ki_tid, kipp->ki_tid);
>>>>>> if (thread == kipp->ki_tid) {
>>>>>> kinfo_proc_thread_name(kipp, name, len);
>>>>>> }
>>>>>> }
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> Problem only is that the TID value in what procstat_getprocs returns in
>>>>>> ki_tid is nowhere near
>>>>>> what pthread_self() returns.
>>>>>> But both manual page and the include file describe the value as Thread ID.
>>>>>> Only in sys/user.h the type is
>>>>>> lwpid_t ki_tid; /* XXXKSE thread id */
>>>>>>
>>>>>> What do I need to translate one tid into the other so I can really
>>>>>> compare them?
>>>>>
>>>>> You need to cast pthread_t * to struct thread *, this is an internal
>>>>> libthr structure which represents the thread in userspace. The
>>>>> structure field tid gives you the tid you want to pass to sysctl.
>>>>
>>>> mmmm,
>>>>
>>>> I'm afraid I'm not quit able to followup on your answer.
>>>>
>>>> Trying to find what to include to be able to cast this, I can only find
>>>> a small bit defined in /usr/src/lib/libthr/thread/thr_private.h.
>>>> /*
>>>> * lwpid_t is 32bit but kernel thr API exports tid as long type
>>>> * to preserve the ABI for M:N model in very early date (r131431).
>>>> */
>>>> #define TID(thread) ((uint32_t) ((thread)->tid))
>>>>
>>>> But that I cannot just "include" that file without a lot of mess, and
>>>> then still it does not compile.
>>>>
>>>> So could you point me to where this private part of struct thread is
>>>> hidding?
>>> I do not understand your confusion. The thr_private.h header is only
>>> for use by libthr, the FreeBSD threading library implementation. The
>>> function that you are trying to implement, requires understanding of the
>>> libthr internals and can only be implemented as part of libthr.
>>>
>>> Any other attempt to translate libthr handle for thread into tid needs
>>> same access to the struct pthread.
>>
>> Oke,
>>
>> I don't have more knowledge of (p)threads than just how to use it.
>> I was trying to do this as a piece of code in the compat.cc of my ceph port.
>>
>> But trying to reread what you write is boils down to: there is no way to
>> link a value returned by (struct pthread *)pthread_self() to the kd_tid
>> value that can be found in the (struct kinfo_proc *) describing that
>> same thread.
> No, this is not what I said.
>
> I am claiming that this functionality must be implemented in libthr.
> So if you want this function, it needs to be added to libthr, and it is
> quite trivial to do.
>
> You can code it, or you might provide (draft of the) man page, and I
> will code it according to the spec.
How about the attached patch for man page part?
>> And even though (struct thread *) has a field:
>> lwpid_t td_tid; /* (b) Thread ID. */
>> that field seems to be stuck at value td_tid = 32767 every time I look
>> at it with gdb.
>>
>> So it is a pity that this is not going to work this way.
-------------- next part --------------
diff --git a/share/man/man3/Makefile b/share/man/man3/Makefile
index 6197b0affb4d..ff2cb02827d4 100644
--- a/share/man/man3/Makefile
+++ b/share/man/man3/Makefile
@@ -334,6 +334,7 @@ PTHREAD_MLINKS+=pthread_rwlock_rdlock.3 pthread_rwlock_tryrdlock.3
PTHREAD_MLINKS+=pthread_rwlock_wrlock.3 pthread_rwlock_trywrlock.3
PTHREAD_MLINKS+=pthread_schedparam.3 pthread_getschedparam.3 \
pthread_schedparam.3 pthread_setschedparam.3
+PTHREAD_MLINKS+=pthread_set_name_np.3 pthread_get_name_np.3
PTHREAD_MLINKS+=pthread_spin_init.3 pthread_spin_destroy.3 \
pthread_spin_lock.3 pthread_spin_trylock.3 \
pthread_spin_lock.3 pthread_spin_unlock.3
diff --git a/share/man/man3/pthread_set_name_np.3 b/share/man/man3/pthread_set_name_np.3
index c8e5cb4f62c0..cb32e52e2baf 100644
--- a/share/man/man3/pthread_set_name_np.3
+++ b/share/man/man3/pthread_set_name_np.3
@@ -24,17 +24,20 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 2, 2016
+.Dd August 12, 2018
.Dt PTHREAD_SET_NAME_NP 3
.Os
.Sh NAME
+.Nm pthread_get_name_np ,
.Nm pthread_set_name_np
-.Nd set the thread name
+.Nd set and retrieve the thread name
.Sh LIBRARY
.Lb libpthread
.Sh SYNOPSIS
.In pthread_np.h
.Ft void
+.Fn pthread_get_name_np "pthread_t thread" "char *name" "size_t len"
+.Ft void
.Fn pthread_set_name_np "pthread_t thread" "const char *name"
.Sh DESCRIPTION
The
@@ -43,11 +46,30 @@ function applies a copy of the given
.Fa name
to the given
.Fa thread .
+.Pp
+The
+.Fn pthread_get_name_np
+retrieves the
+.Fa name
+associated with
+.Fa thread .
+If
+.Fn pthread_set_name_np
+was not previously called for
+.Fa thread ,
+the buffer pointed to by
+.Fa name
+will be empty.
.Sh ERRORS
-Because of the debugging nature of this function, all errors that may
+Because of the debugging nature of these functions, all errors that may
appear inside are silently ignored.
.Sh SEE ALSO
.Xr thr_set_name 2
+.Sh STANDARDS
+.Fn pthread_set_name_np
+and
+.Fn pthread_get_name_np
+functions are non-standard extensions.
.Sh AUTHORS
This manual page was written by
.An Alexey Zelkin Aq Mt phantom at FreeBSD.org .
More information about the freebsd-hackers
mailing list