Hello Chandan, Thanks for the proposed page. Comments below. On Thu, Oct 25, 2012 at 7:54 PM, Chandan Apsangi <chandan.jc@xxxxxxxxx> wrote: > Hi, > > I have been working on the man pages (version 3.43) for the following APIs: > > pthread_setname_np > pthread_getname_np It would be best to integrate these into a single page please. > Currently I'm sending the man page document for pthread_setname_np(). > Will submit pthread_getname_np() as soon as I get some review comments > for this one. See above. > I looked at the following sources on the Internet, plus the > glibc-2.16.0 source code, to gather information about these APIs. > > http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fapis%2Fpthread_setname_np.htm > http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51B_HTML/MAN/MAN3/2477____.HTM > http://www.qnx.com/developers/docs/6.3.2/neutrino/lib_ref/p/pthread_setname_np.html > http://sourceware.org/ml/libc-help/2010-03/msg00018.html > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=4614a696bd1c3a9af3a08f0e5874830a85b889d4 > > Following is the source of the man page. Please review the same, and > let me know your comments. > > .\" Copyright (c) 2008 Linux Foundation, written by Chandan Apsangi > .\" <chandan.jc@xxxxxxxxx> Why the copyright assignment to LF? > .\" > .\" Permission is granted to make and distribute verbatim copies of this > .\" manual provided the copyright notice and this permission notice are > .\" preserved on all copies. > .\" > .\" Permission is granted to copy and distribute modified versions of this > .\" manual under the conditions for verbatim copying, provided that the > .\" entire resulting derived work is distributed under the terms of a > .\" permission notice identical to this one. > .\" > .\" Since the Linux kernel and libraries are constantly changing, this > .\" manual page may be incorrect or out-of-date. The author(s) assume no > .\" responsibility for errors or omissions, or for damages resulting from > .\" the use of the information contained herein. The author(s) may not > .\" have taken the same level of care in the production of this manual, > .\" which is licensed free of charge, as they might when working > .\" professionally. > .\" > .\" Formatted or processed versions of this manual, if unaccompanied by > .\" the source, must acknowledge the copyright and authors of this work. > .\" > .TH PTHREAD_SETNAME_NP 3 2012-10-24 "Linux" "Linux Programmer's Manual" > .SH NAME > pthread_setname_np \- Name a thread > .SH SYNOPSIS > .nf I think you need to add .B #define _GNU_SOURCE > .B #include <pthread.h> > > .BI "int pthread_setname_np(pthread_t *" thread ", const char *" name "); > .fi > .sp > Compile and link with \fI\-pthread\fP. > .SH DESCRIPTION > By default, all the threads created using > .BR pthread_create (3) > are unnamed. The preceding is not true. They all have the name of the program, initially. > Using this API, Using pthread_setname_np() > users can specify a unique name for a > thread, which can be particularly useful for debugging complicated > multi-threaded applications. The thread name is a meaningful C Have a read of man-pages(7). It has many useful tips. One of them is, start new sentences on new source lines please. > language string, whose length is restricted to 16 characters. Anything > greater than this would lead to an error. > .SH RETURN VALUE > On success, > .BR pthread_setname_np () > returns 0; > on error, it returns an error number. > .SH ERRORS In the ERRORS section, it may be be best to use separate lists for the set and get functions. > .\" FIXME . Find out and add other errors I think it would be sufficient to say that if the function fails to open /proc/self/task/<TID>/comm, then the call may fail with one of the errors described in open(2). > .TP > .B ERANGE > The length of the string specified as second argument exceeds the allowed limit. > .TP > .B EIO > The name could not be written to the thread specific file due to some I/O error. > > .SH CONFORMING TO > POSIX.1-2001. The above is untrue. Hence the "_np" in the name. Rather, this is a nonstandard function, present in glibc and and a few other systems. > .SH NOTES > This API The pthread_setname_np() function. > internally writes to the thread specific comm file under > .IR /proc > filesystem: > .IR /proc/self/task/<tid>/comm. > .SH BUGS > NO BUGS YET. So, you can omit the BUGS section. > .SH EXAMPLE > The program below demonstrates the use of > .BR pthread_setname_np (), > as well as > .BR pthread_getname_np (). Please insert a sample run of the program here. See for example the eventfd(2) page. > .SS Program source In general, man-pages formats all code as per K&R style. You can use: indent -kr prog-name.c to make the job easy. > \& > .nf #define _GNU_SOURCE > #include <pthread.h> > #include <stdio.h> > #include <string.h> > #include <unistd.h> > > void *threadfunc(void *parm) Add "static" to this function declaration. > { > printf("In the thread.\n"); > sleep(20); // allow main program to set the thread name > return NULL; > } > > int main(int argc, char **argv) > { > pthread_t thread; > int rc=0; No need to initialize 'rc' #define NAMELEN 16 and then use NAMELEN (or whatever you think is a decent name) instead of 16 in the rest of the code. > char theName[16]; > > memset(theName, 0, sizeof(theName)); Why the memset()? > printf("Creating an unnamed thread\n"); The above text is not quite right. See comments above. The "\n" should be "\\n". Try viewing the page to see why. > rc = pthread_create(&thread, NULL, threadfunc, NULL); > if(0 == rc) Better to please make this if (rc == 0) and so on in the rest of the code. I know why people do what you've done above, but it's less readable and gcc is smart enough that we don't need to do it. But there's a more general comment: the logic for handling errors is overly complicated. See below. > { > rc = pthread_setname_np(thread, "THREADFOO"); > if(0 == rc) Add space after "if" please > { > sleep(2); > rc = pthread_getname_np(thread, theName, 16); > if(0 == rc) > { > printf("The thread name is %s.", theName); The '.' should be "\\n" > } > else > { > perror("pthread_getname_np"); On each error after these pthread calls: * The errno number is NOT in errno, so perror() will not do the right thing. * Terminate the program, rather than carry on. You may find defining a macro like this useful #define errExitEN(en, msg) \ do { errno = en; perror(msg); \ exit(EXIT_FAILURE); } while (0) When you employ this, then you can eliminate your deeply nested 'if' statements. > } > } > else > { > perror("pthread_setname_np"); > } > rc = pthread_join(thread, NULL); > } > if(0 != rc) > { > perror("pthread_create"); > } > printf("Done"); Missing "\\n" > return(rc); Better: exit(EXIT_SUCCESS) > } Please ensure that the code compiles with "cc -Wall" > .fi > .SH SEE ALSO > .ad l > .nh .BR prctl (2), > .BR pthread_getname_np (3), > .BR pthread_create (3), > .BR pthreads (7) Thanks, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Author of "The Linux Programming Interface"; http://man7.org/tlpi/ -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html