mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
nptl: Replace some stubs with the Linux implementation
The stubs for pthread_getaffinity_np, pthread_getname_np,
pthread_setaffinity_np, pthread_setname_np are replaced, and corresponding
tests are moved.
After the removal of the NaCl port, nptl is Linux-specific, and the stubs
are no longer needed. This effectively reverts commit
c76d1ff514
("NPTL: Add stubs for Linux-only
extension functions.").
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@ -321,14 +321,19 @@ tests = tst-attr2 tst-attr3 tst-default-attr \
|
|||||||
tst-thread-exit-clobber tst-minstack-cancel tst-minstack-exit \
|
tst-thread-exit-clobber tst-minstack-cancel tst-minstack-exit \
|
||||||
tst-minstack-throw \
|
tst-minstack-throw \
|
||||||
tst-rwlock-pwn \
|
tst-rwlock-pwn \
|
||||||
tst-unwind-thread
|
tst-unwind-thread \
|
||||||
|
tst-thread-affinity-pthread \
|
||||||
|
tst-thread-affinity-pthread2 \
|
||||||
|
tst-thread-affinity-sched \
|
||||||
|
|
||||||
|
|
||||||
tests-container = tst-pthread-getattr
|
tests-container = tst-pthread-getattr
|
||||||
|
|
||||||
tests-internal := tst-robustpi8 tst-rwlock19 tst-rwlock20 \
|
tests-internal := tst-robustpi8 tst-rwlock19 tst-rwlock20 \
|
||||||
tst-sem11 tst-sem12 tst-sem13 \
|
tst-sem11 tst-sem12 tst-sem13 \
|
||||||
tst-barrier5 tst-signal7 tst-mutex8 tst-mutex8-static \
|
tst-barrier5 tst-signal7 tst-mutex8 tst-mutex8-static \
|
||||||
tst-mutexpi8 tst-mutexpi8-static tst-cancel25
|
tst-mutexpi8 tst-mutexpi8-static tst-cancel25 \
|
||||||
|
tst-setgetname \
|
||||||
|
|
||||||
xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \
|
xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \
|
||||||
tst-mutexpp1 tst-mutexpp6 tst-mutexpp10
|
tst-mutexpp1 tst-mutexpp6 tst-mutexpp10
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Get the processor affinity of a thread. Stub version.
|
/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
||||||
Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
@ -16,17 +16,43 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__pthread_getaffinity_np (pthread_t th, size_t cpusetsize, cpu_set_t *cpuset)
|
__pthread_getaffinity_new (pthread_t th, size_t cpusetsize, cpu_set_t *cpuset)
|
||||||
{
|
{
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
const struct pthread *pd = (const struct pthread *) th;
|
||||||
|
|
||||||
if (INVALID_TD_P (pd))
|
int res = INTERNAL_SYSCALL_CALL (sched_getaffinity, pd->tid,
|
||||||
return ESRCH;
|
MIN (INT_MAX, cpusetsize), cpuset);
|
||||||
|
if (INTERNAL_SYSCALL_ERROR_P (res))
|
||||||
|
return INTERNAL_SYSCALL_ERRNO (res);
|
||||||
|
|
||||||
return ENOSYS;
|
/* Clean the rest of the memory the kernel didn't do. */
|
||||||
|
memset ((char *) cpuset + res, '\0', cpusetsize - res);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
weak_alias (__pthread_getaffinity_np, pthread_getaffinity_np)
|
strong_alias (__pthread_getaffinity_new, __pthread_getaffinity_np)
|
||||||
stub_warning (pthread_getaffinity_np)
|
versioned_symbol (libpthread, __pthread_getaffinity_new,
|
||||||
|
pthread_getaffinity_np, GLIBC_2_3_4);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4)
|
||||||
|
int
|
||||||
|
__pthread_getaffinity_old (pthread_t th, cpu_set_t *cpuset)
|
||||||
|
{
|
||||||
|
/* The old interface by default assumed a 1024 processor bitmap. */
|
||||||
|
return __pthread_getaffinity_new (th, 128, cpuset);
|
||||||
|
}
|
||||||
|
compat_symbol (libpthread, __pthread_getaffinity_old, pthread_getaffinity_np,
|
||||||
|
GLIBC_2_3_3);
|
||||||
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* pthread_getname_np -- Get thread name. Stub version.
|
/* pthread_getname_np -- Get thread name. Linux version
|
||||||
Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -17,16 +17,53 @@
|
|||||||
not, see <https://www.gnu.org/licenses/>. */
|
not, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
|
||||||
|
#include <not-cancel.h>
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread_getname_np (pthread_t th, char *buf, size_t len)
|
pthread_getname_np (pthread_t th, char *buf, size_t len)
|
||||||
{
|
{
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
const struct pthread *pd = (const struct pthread *) th;
|
||||||
|
|
||||||
if (INVALID_TD_P (pd))
|
/* Unfortunately the kernel headers do not export the TASK_COMM_LEN
|
||||||
return ESRCH;
|
macro. So we have to define it here. */
|
||||||
|
#define TASK_COMM_LEN 16
|
||||||
|
if (len < TASK_COMM_LEN)
|
||||||
|
return ERANGE;
|
||||||
|
|
||||||
return ENOSYS;
|
if (pd == THREAD_SELF)
|
||||||
|
return prctl (PR_GET_NAME, buf) ? errno : 0;
|
||||||
|
|
||||||
|
#define FMT "/proc/self/task/%u/comm"
|
||||||
|
char fname[sizeof (FMT) + 8];
|
||||||
|
sprintf (fname, FMT, (unsigned int) pd->tid);
|
||||||
|
|
||||||
|
int fd = __open64_nocancel (fname, O_RDONLY);
|
||||||
|
if (fd == -1)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
int res = 0;
|
||||||
|
ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, len));
|
||||||
|
if (n < 0)
|
||||||
|
res = errno;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (buf[n - 1] == '\n')
|
||||||
|
buf[n - 1] = '\0';
|
||||||
|
else if (n == len)
|
||||||
|
res = ERANGE;
|
||||||
|
else
|
||||||
|
buf[n] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
__close_nocancel_nostatus (fd);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
stub_warning (pthread_getname_np)
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Set the processor affinity of a thread. Stub version.
|
/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
||||||
Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
@ -16,17 +16,38 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread_setaffinity_np (pthread_t th,
|
__pthread_setaffinity_new (pthread_t th, size_t cpusetsize,
|
||||||
size_t cpusetsize, const cpu_set_t *cpuset)
|
const cpu_set_t *cpuset)
|
||||||
{
|
{
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
const struct pthread *pd = (const struct pthread *) th;
|
||||||
|
int res;
|
||||||
|
|
||||||
if (INVALID_TD_P (pd))
|
res = INTERNAL_SYSCALL_CALL (sched_setaffinity, pd->tid, cpusetsize,
|
||||||
return ESRCH;
|
cpuset);
|
||||||
|
|
||||||
return ENOSYS;
|
return (INTERNAL_SYSCALL_ERROR_P (res)
|
||||||
|
? INTERNAL_SYSCALL_ERRNO (res)
|
||||||
|
: 0);
|
||||||
}
|
}
|
||||||
stub_warning (pthread_setaffinity_np)
|
versioned_symbol (libpthread, __pthread_setaffinity_new,
|
||||||
|
pthread_setaffinity_np, GLIBC_2_3_4);
|
||||||
|
|
||||||
|
|
||||||
|
#if SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4)
|
||||||
|
int
|
||||||
|
__pthread_setaffinity_old (pthread_t th, cpu_set_t *cpuset)
|
||||||
|
{
|
||||||
|
/* The old interface by default assumed a 1024 processor bitmap. */
|
||||||
|
return __pthread_setaffinity_new (th, 128, cpuset);
|
||||||
|
}
|
||||||
|
compat_symbol (libpthread, __pthread_setaffinity_old, pthread_setaffinity_np,
|
||||||
|
GLIBC_2_3_3);
|
||||||
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* pthread_setname_np -- Set thread name. Stub version.
|
/* pthread_setname_np -- Set thread name. Linux version
|
||||||
Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -17,16 +17,47 @@
|
|||||||
not, see <https://www.gnu.org/licenses/>. */
|
not, see <https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
|
||||||
|
#include <not-cancel.h>
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread_setname_np (pthread_t th, const char *name)
|
pthread_setname_np (pthread_t th, const char *name)
|
||||||
{
|
{
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
const struct pthread *pd = (const struct pthread *) th;
|
||||||
|
|
||||||
if (INVALID_TD_P (pd))
|
/* Unfortunately the kernel headers do not export the TASK_COMM_LEN
|
||||||
return ESRCH;
|
macro. So we have to define it here. */
|
||||||
|
#define TASK_COMM_LEN 16
|
||||||
|
size_t name_len = strlen (name);
|
||||||
|
if (name_len >= TASK_COMM_LEN)
|
||||||
|
return ERANGE;
|
||||||
|
|
||||||
return ENOSYS;
|
if (pd == THREAD_SELF)
|
||||||
|
return prctl (PR_SET_NAME, name) ? errno : 0;
|
||||||
|
|
||||||
|
#define FMT "/proc/self/task/%u/comm"
|
||||||
|
char fname[sizeof (FMT) + 8];
|
||||||
|
sprintf (fname, FMT, (unsigned int) pd->tid);
|
||||||
|
|
||||||
|
int fd = __open64_nocancel (fname, O_RDWR);
|
||||||
|
if (fd == -1)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
int res = 0;
|
||||||
|
ssize_t n = TEMP_FAILURE_RETRY (__write_nocancel (fd, name, name_len));
|
||||||
|
if (n < 0)
|
||||||
|
res = errno;
|
||||||
|
else if (n != name_len)
|
||||||
|
res = EIO;
|
||||||
|
|
||||||
|
__close_nocancel_nostatus (fd);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
stub_warning (pthread_setname_np)
|
|
||||||
|
@ -299,8 +299,5 @@ CFLAGS-gai.c += -DNEED_NETLINK
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(subdir),nptl)
|
ifeq ($(subdir),nptl)
|
||||||
tests += tst-align-clone tst-getpid1 \
|
tests += tst-align-clone tst-getpid1
|
||||||
tst-thread-affinity-pthread tst-thread-affinity-pthread2 \
|
|
||||||
tst-thread-affinity-sched
|
|
||||||
tests-internal += tst-setgetname
|
|
||||||
endif
|
endif
|
||||||
|
@ -1,58 +0,0 @@
|
|||||||
/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <pthreadP.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <shlib-compat.h>
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
__pthread_getaffinity_new (pthread_t th, size_t cpusetsize, cpu_set_t *cpuset)
|
|
||||||
{
|
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
|
||||||
|
|
||||||
int res = INTERNAL_SYSCALL_CALL (sched_getaffinity, pd->tid,
|
|
||||||
MIN (INT_MAX, cpusetsize), cpuset);
|
|
||||||
if (INTERNAL_SYSCALL_ERROR_P (res))
|
|
||||||
return INTERNAL_SYSCALL_ERRNO (res);
|
|
||||||
|
|
||||||
/* Clean the rest of the memory the kernel didn't do. */
|
|
||||||
memset ((char *) cpuset + res, '\0', cpusetsize - res);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
strong_alias (__pthread_getaffinity_new, __pthread_getaffinity_np)
|
|
||||||
versioned_symbol (libpthread, __pthread_getaffinity_new,
|
|
||||||
pthread_getaffinity_np, GLIBC_2_3_4);
|
|
||||||
|
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4)
|
|
||||||
int
|
|
||||||
__pthread_getaffinity_old (pthread_t th, cpu_set_t *cpuset)
|
|
||||||
{
|
|
||||||
/* The old interface by default assumed a 1024 processor bitmap. */
|
|
||||||
return __pthread_getaffinity_new (th, 128, cpuset);
|
|
||||||
}
|
|
||||||
compat_symbol (libpthread, __pthread_getaffinity_old, pthread_getaffinity_np,
|
|
||||||
GLIBC_2_3_3);
|
|
||||||
#endif
|
|
@ -1,69 +0,0 @@
|
|||||||
/* pthread_getname_np -- Get thread name. Linux version
|
|
||||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2.1 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
|
||||||
not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <pthreadP.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/prctl.h>
|
|
||||||
|
|
||||||
#include <not-cancel.h>
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
pthread_getname_np (pthread_t th, char *buf, size_t len)
|
|
||||||
{
|
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
|
||||||
|
|
||||||
/* Unfortunately the kernel headers do not export the TASK_COMM_LEN
|
|
||||||
macro. So we have to define it here. */
|
|
||||||
#define TASK_COMM_LEN 16
|
|
||||||
if (len < TASK_COMM_LEN)
|
|
||||||
return ERANGE;
|
|
||||||
|
|
||||||
if (pd == THREAD_SELF)
|
|
||||||
return prctl (PR_GET_NAME, buf) ? errno : 0;
|
|
||||||
|
|
||||||
#define FMT "/proc/self/task/%u/comm"
|
|
||||||
char fname[sizeof (FMT) + 8];
|
|
||||||
sprintf (fname, FMT, (unsigned int) pd->tid);
|
|
||||||
|
|
||||||
int fd = __open64_nocancel (fname, O_RDONLY);
|
|
||||||
if (fd == -1)
|
|
||||||
return errno;
|
|
||||||
|
|
||||||
int res = 0;
|
|
||||||
ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, len));
|
|
||||||
if (n < 0)
|
|
||||||
res = errno;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (buf[n - 1] == '\n')
|
|
||||||
buf[n - 1] = '\0';
|
|
||||||
else if (n == len)
|
|
||||||
res = ERANGE;
|
|
||||||
else
|
|
||||||
buf[n] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
__close_nocancel_nostatus (fd);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <pthreadP.h>
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <shlib-compat.h>
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
__pthread_setaffinity_new (pthread_t th, size_t cpusetsize,
|
|
||||||
const cpu_set_t *cpuset)
|
|
||||||
{
|
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
res = INTERNAL_SYSCALL_CALL (sched_setaffinity, pd->tid, cpusetsize,
|
|
||||||
cpuset);
|
|
||||||
|
|
||||||
return (INTERNAL_SYSCALL_ERROR_P (res)
|
|
||||||
? INTERNAL_SYSCALL_ERRNO (res)
|
|
||||||
: 0);
|
|
||||||
}
|
|
||||||
versioned_symbol (libpthread, __pthread_setaffinity_new,
|
|
||||||
pthread_setaffinity_np, GLIBC_2_3_4);
|
|
||||||
|
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4)
|
|
||||||
int
|
|
||||||
__pthread_setaffinity_old (pthread_t th, cpu_set_t *cpuset)
|
|
||||||
{
|
|
||||||
/* The old interface by default assumed a 1024 processor bitmap. */
|
|
||||||
return __pthread_setaffinity_new (th, 128, cpuset);
|
|
||||||
}
|
|
||||||
compat_symbol (libpthread, __pthread_setaffinity_old, pthread_setaffinity_np,
|
|
||||||
GLIBC_2_3_3);
|
|
||||||
#endif
|
|
@ -1,63 +0,0 @@
|
|||||||
/* pthread_setname_np -- Set thread name. Linux version
|
|
||||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2.1 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
|
||||||
not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <pthreadP.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/prctl.h>
|
|
||||||
|
|
||||||
#include <not-cancel.h>
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
pthread_setname_np (pthread_t th, const char *name)
|
|
||||||
{
|
|
||||||
const struct pthread *pd = (const struct pthread *) th;
|
|
||||||
|
|
||||||
/* Unfortunately the kernel headers do not export the TASK_COMM_LEN
|
|
||||||
macro. So we have to define it here. */
|
|
||||||
#define TASK_COMM_LEN 16
|
|
||||||
size_t name_len = strlen (name);
|
|
||||||
if (name_len >= TASK_COMM_LEN)
|
|
||||||
return ERANGE;
|
|
||||||
|
|
||||||
if (pd == THREAD_SELF)
|
|
||||||
return prctl (PR_SET_NAME, name) ? errno : 0;
|
|
||||||
|
|
||||||
#define FMT "/proc/self/task/%u/comm"
|
|
||||||
char fname[sizeof (FMT) + 8];
|
|
||||||
sprintf (fname, FMT, (unsigned int) pd->tid);
|
|
||||||
|
|
||||||
int fd = __open64_nocancel (fname, O_RDWR);
|
|
||||||
if (fd == -1)
|
|
||||||
return errno;
|
|
||||||
|
|
||||||
int res = 0;
|
|
||||||
ssize_t n = TEMP_FAILURE_RETRY (__write_nocancel (fd, name, name_len));
|
|
||||||
if (n < 0)
|
|
||||||
res = errno;
|
|
||||||
else if (n != name_len)
|
|
||||||
res = EIO;
|
|
||||||
|
|
||||||
__close_nocancel_nostatus (fd);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
Reference in New Issue
Block a user