Write a version for pthread_get_name_np

Willem Jan Withagen wjw at digiware.nl
Sun Aug 12 23:36:31 UTC 2018


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.

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.

--WjW




More information about the freebsd-hackers mailing list