Print this page
8158 Want named threads API
9857 proc manpages should have LIBRARY section

*** 23,33 **** * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016 by Delphix. All rights reserved. * Copyright (c) 2017 by The MathWorks, Inc. All rights reserved. */ /* ! * Copyright 2016 Joyent, Inc. */ #include "lint.h" #include "thr_uberdata.h" #include <pthread.h> --- 23,33 ---- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016 by Delphix. All rights reserved. * Copyright (c) 2017 by The MathWorks, Inc. All rights reserved. */ /* ! * Copyright 2018 Joyent, Inc. */ #include "lint.h" #include "thr_uberdata.h" #include <pthread.h>
*** 558,568 **** return (ulwp); } int _thrp_create(void *stk, size_t stksize, void *(*func)(void *), void *arg, ! long flags, thread_t *new_thread, size_t guardsize) { ulwp_t *self = curthread; uberdata_t *udp = self->ul_uberdata; ucontext_t uc; uint_t lwp_flags; --- 558,568 ---- return (ulwp); } int _thrp_create(void *stk, size_t stksize, void *(*func)(void *), void *arg, ! long flags, thread_t *new_thread, size_t guardsize, const char *name) { ulwp_t *self = curthread; uberdata_t *udp = self->ul_uberdata; ucontext_t uc; uint_t lwp_flags;
*** 713,722 **** --- 713,725 ---- tdb_event(TD_CREATE, udp); } exit_critical(self); + if (name != NULL) + (void) pthread_setname_np(tid, name); + if (!(flags & THR_SUSPENDED)) (void) _thrp_continue(tid, TSTP_REGULAR); return (0); }
*** 723,733 **** int thr_create(void *stk, size_t stksize, void *(*func)(void *), void *arg, long flags, thread_t *new_thread) { ! return (_thrp_create(stk, stksize, func, arg, flags, new_thread, 0)); } /* * A special cancellation cleanup hook for DCE. * cleanuphndlr, when it is not NULL, will contain a callback --- 726,737 ---- int thr_create(void *stk, size_t stksize, void *(*func)(void *), void *arg, long flags, thread_t *new_thread) { ! return (_thrp_create(stk, stksize, func, arg, flags, new_thread, 0, ! NULL)); } /* * A special cancellation cleanup hook for DCE. * cleanuphndlr, when it is not NULL, will contain a callback
*** 2396,2405 **** --- 2400,2490 ---- __nthreads(void) { return (curthread->ul_uberdata->nthreads); } + /* "/proc/self/lwp/%u/lwpname" w/o stdio */ + static void + lwpname_path(pthread_t tid, char *buf, size_t bufsize) + { + (void) strlcpy(buf, "/proc/self/lwp/", bufsize); + ultos((uint64_t)tid, 10, buf + strlen(buf)); + (void) strlcat(buf, "/lwpname", bufsize); + } + + #pragma weak pthread_setname_np = thr_setname + int + thr_setname(pthread_t tid, const char *name) + { + extern ssize_t __write(int, const void *, size_t); + char path[PATH_MAX]; + int saved_errno; + size_t len; + ssize_t n; + int fd; + + if (name == NULL) + name = ""; + + len = strlen(name) + 1; + if (len > THREAD_NAME_MAX) + return (ERANGE); + + lwpname_path(tid, path, sizeof (path)); + + if ((fd = __open(path, O_WRONLY, 0)) < 0) { + if (errno == ENOENT) + errno = ESRCH; + return (errno); + } + + n = __write(fd, name, len); + saved_errno = errno; + (void) __close(fd); + + if (n < 0) + return (saved_errno); + if (n != len) + return (EFAULT); + return (0); + } + + #pragma weak pthread_getname_np = thr_getname + int + thr_getname(pthread_t tid, char *buf, size_t bufsize) + { + extern ssize_t __read(int, void *, size_t); + char name[THREAD_NAME_MAX]; + char path[PATH_MAX]; + int saved_errno; + ssize_t n; + int fd; + + if (buf == NULL) + return (EINVAL); + + lwpname_path(tid, path, sizeof (path)); + + if ((fd = __open(path, O_RDONLY, 0)) < 0) { + if (errno == ENOENT) + errno = ESRCH; + return (errno); + } + + n = __read(fd, name, sizeof (name)); + saved_errno = errno; + (void) __close(fd); + + if (n < 0) + return (saved_errno); + if (n != sizeof (name)) + return (EFAULT); + if (strlcpy(buf, name, bufsize) >= bufsize) + return (ERANGE); + return (0); + } + /* * XXX * The remainder of this file implements the private interfaces to java for * garbage collection. It is no longer used, at least by java 1.2. * It can all go away once all old JVMs have disappeared.