diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/nptl/bits/libc-lockP.h | 12 | ||||
-rw-r--r-- | sysdeps/nptl/shm-directory.h | 31 | ||||
-rw-r--r-- | sysdeps/posix/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/posix/shm-directory.c | 3 | ||||
-rw-r--r-- | sysdeps/posix/shm-directory.h | 11 | ||||
-rw-r--r-- | sysdeps/posix/shm_open.c | 2 | ||||
-rw-r--r-- | sysdeps/posix/shm_unlink.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/shm-directory.c | 3 |
8 files changed, 61 insertions, 7 deletions
diff --git a/sysdeps/nptl/bits/libc-lockP.h b/sysdeps/nptl/bits/libc-lockP.h index 78c545382b..fa8c866ff3 100644 --- a/sysdeps/nptl/bits/libc-lockP.h +++ b/sysdeps/nptl/bits/libc-lockP.h @@ -34,6 +34,12 @@ #include <tls.h> #include <pthread-functions.h> +#if IS_IN (libpthread) +/* This gets us the declarations of the __pthread_* internal names, + and hidden_proto for them. */ +# include <nptl/pthreadP.h> +#endif + /* Mutex type. */ #if !IS_IN (libc) && !IS_IN (libpthread) typedef pthread_mutex_t __libc_lock_t; @@ -114,6 +120,12 @@ typedef pthread_key_t __libc_key_t; (__libc_pthread_functions_init ? PTHFCT_CALL (ptr_##FUNC, ARGS) : ELSE) # define __libc_ptf_call_always(FUNC, ARGS) \ PTHFCT_CALL (ptr_##FUNC, ARGS) +#elif IS_IN (libpthread) +# define PTFAVAIL(NAME) 1 +# define __libc_ptf_call(FUNC, ARGS, ELSE) \ + FUNC ARGS +# define __libc_ptf_call_always(FUNC, ARGS) \ + FUNC ARGS #else # define PTFAVAIL(NAME) (NAME != NULL) # define __libc_ptf_call(FUNC, ARGS, ELSE) \ diff --git a/sysdeps/nptl/shm-directory.h b/sysdeps/nptl/shm-directory.h new file mode 100644 index 0000000000..ae4d80a224 --- /dev/null +++ b/sysdeps/nptl/shm-directory.h @@ -0,0 +1,31 @@ +/* Header for directory for shm/sem files. NPTL version. + Copyright (C) 2014 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; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _SHM_DIRECTORY_H + +#include <sysdeps/posix/shm-directory.h> + +/* For NPTL the __shm_directory function lives in libpthread. + We don't want PLT calls from there. But it's also used from + librt, so it cannot just be declared hidden. */ + +#if IS_IN (libpthread) +hidden_proto (__shm_directory) +#endif + +#endif /* shm-directory.h */ diff --git a/sysdeps/posix/Makefile b/sysdeps/posix/Makefile index 8e5f7c3bba..52f20f5d97 100644 --- a/sysdeps/posix/Makefile +++ b/sysdeps/posix/Makefile @@ -4,6 +4,8 @@ TMP_MAX = 238328 L_ctermid = 9 L_cuserid = 9 -ifeq ($(subdir),rt) +ifeq ($(subdir)|$(have-thread-library),rt|no) +# With NPTL, this lives in libpthread so it can be used for sem_open too. +# Without NPTL, it's just private in librt. librt-routines += shm-directory endif diff --git a/sysdeps/posix/shm-directory.c b/sysdeps/posix/shm-directory.c index aea5f963b0..5623d32c1d 100644 --- a/sysdeps/posix/shm-directory.c +++ b/sysdeps/posix/shm-directory.c @@ -31,5 +31,8 @@ __shm_directory (size_t *len) *len = sizeof SHMDIR - 1; return SHMDIR; } +# if IS_IN (libpthread) +hidden_def (__shm_directory) +# endif #endif diff --git a/sysdeps/posix/shm-directory.h b/sysdeps/posix/shm-directory.h index 1c4d965b28..84f1f94c80 100644 --- a/sysdeps/posix/shm-directory.h +++ b/sysdeps/posix/shm-directory.h @@ -36,9 +36,10 @@ extern const char *__shm_directory (size_t *len); strlen (NAME) + 1. If NAME is invalid, it sets errno to ERRNO_FOR_INVALID and returns RETVAL_FOR_INVALID. Finally, it defines the local variable SHM_NAME, giving the absolute file name of the shm - file corresponding to NAME. */ + file corresponding to NAME. PREFIX is a string constant used as a + prefix on NAME. */ -#define SHM_GET_NAME(errno_for_invalid, retval_for_invalid) \ +#define SHM_GET_NAME(errno_for_invalid, retval_for_invalid, prefix) \ size_t shm_dirlen; \ const char *shm_dir = __shm_directory (&shm_dirlen); \ /* If we don't know what directory to use, there is nothing we can do. */ \ @@ -57,7 +58,9 @@ extern const char *__shm_directory (size_t *len); __set_errno (errno_for_invalid); \ return retval_for_invalid; \ } \ - char *shm_name = __alloca (shm_dirlen + namelen); \ - __mempcpy (__mempcpy (shm_name, shm_dir, shm_dirlen), name, namelen) + char *shm_name = __alloca (shm_dirlen + sizeof prefix - 1 + namelen); \ + __mempcpy (__mempcpy (__mempcpy (shm_name, shm_dir, shm_dirlen), \ + prefix, sizeof prefix - 1), \ + name, namelen) #endif /* shm-directory.h */ diff --git a/sysdeps/posix/shm_open.c b/sysdeps/posix/shm_open.c index 064fecf3f2..1f017c55c6 100644 --- a/sysdeps/posix/shm_open.c +++ b/sysdeps/posix/shm_open.c @@ -32,7 +32,7 @@ int shm_open (const char *name, int oflag, mode_t mode) { - SHM_GET_NAME (EINVAL, -1); + SHM_GET_NAME (EINVAL, -1, ""); # ifdef O_NOFOLLOW oflag |= O_NOFOLLOW; diff --git a/sysdeps/posix/shm_unlink.c b/sysdeps/posix/shm_unlink.c index 81c3a02642..7d69c63258 100644 --- a/sysdeps/posix/shm_unlink.c +++ b/sysdeps/posix/shm_unlink.c @@ -32,7 +32,7 @@ int shm_unlink (const char *name) { - SHM_GET_NAME (ENOENT, -1); + SHM_GET_NAME (ENOENT, -1, ""); int result = unlink (shm_name); if (result < 0 && errno == EPERM) diff --git a/sysdeps/unix/sysv/linux/shm-directory.c b/sysdeps/unix/sysv/linux/shm-directory.c index 9340f9c331..24b6c53296 100644 --- a/sysdeps/unix/sysv/linux/shm-directory.c +++ b/sysdeps/unix/sysv/linux/shm-directory.c @@ -133,6 +133,9 @@ __shm_directory (size_t *len) *len = mountpoint.dirlen; return mountpoint.dir; } +#if IS_IN (libpthread) +hidden_def (__shm_directory) +#endif /* Make sure the table is freed if we want to free everything before |