Applied, thanks! Sergey Bugaev, le lun. 30 janv. 2023 15:52:16 +0300, a ecrit: > This adds a special SHM_ANON value that can be passed into shm_open () > in place of a name. When called in this way, shm_open () will create a > new anonymous shared memory file. The file will be created in the same > way that other shared memory files are created (i.e., under /dev/shm/), > except that it is not given a name and therefore cannot be reached from > the file system, nor by other calls to shm_open (). This is accomplished > by utilizing O_TMPFILE. > > This is intended to be compatible with FreeBSD's API of the same name. > > Signed-off-by: Sergey Bugaev <buga...@gmail.com> > --- > posix/shm-directory.c | 25 +++++++++++++++++++++---- > rt/shm_open.c | 5 +++++ > sysdeps/mach/hurd/bits/mman_ext.h | 25 +++++++++++++++++++++++++ > 3 files changed, 51 insertions(+), 4 deletions(-) > create mode 100644 sysdeps/mach/hurd/bits/mman_ext.h > > diff --git a/posix/shm-directory.c b/posix/shm-directory.c > index 47e2355d..86d9fd8e 100644 > --- a/posix/shm-directory.c > +++ b/posix/shm-directory.c > @@ -23,17 +23,34 @@ > #include <alloc_buffer.h> > #include <shm-directory.h> > #include <string.h> > +#include <sys/mman.h> > +#include <fcntl.h> > > int > __shm_get_name (struct shmdir_name *result, const char *name, bool > sem_prefix) > { > + struct alloc_buffer buffer; > + size_t namelen; > + > + buffer = alloc_buffer_create (result->name, sizeof (result->name)); > + alloc_buffer_copy_bytes (&buffer, SHMDIR, strlen (SHMDIR)); > + > +#if defined (SHM_ANON) && defined (O_TMPFILE) > + if (name == SHM_ANON) > + { > + /* For SHM_ANON, we want shm_open () to pass O_TMPFILE to open (), > + with SHMDIR itself as the path. So, leave it at that. */ > + alloc_buffer_add_byte (&buffer, 0); > + if (alloc_buffer_has_failed (&buffer)) > + return -1; > + return 0; > + } > +#endif > + > while (name[0] == '/') > ++name; > - size_t namelen = strlen (name); > + namelen = strlen (name); > > - struct alloc_buffer buffer > - = alloc_buffer_create (result->name, sizeof (result->name)); > - alloc_buffer_copy_bytes (&buffer, SHMDIR, strlen (SHMDIR)); > if (sem_prefix) > alloc_buffer_copy_bytes (&buffer, "sem.", strlen ("sem.")); > alloc_buffer_copy_bytes (&buffer, name, namelen + 1); > diff --git a/rt/shm_open.c b/rt/shm_open.c > index 48970bbc..6c1f4d60 100644 > --- a/rt/shm_open.c > +++ b/rt/shm_open.c > @@ -23,6 +23,7 @@ > #include <shlib-compat.h> > #include <shm-directory.h> > #include <unistd.h> > +#include <sys/mman.h> > > /* Open shared memory object. */ > int > @@ -36,6 +37,10 @@ __shm_open (const char *name, int oflag, mode_t mode) > } > > oflag |= O_NOFOLLOW | O_CLOEXEC; > +#if defined (SHM_ANON) && defined (O_TMPFILE) > + if (name == SHM_ANON) > + oflag |= O_TMPFILE; > +#endif > > int fd = __open64_nocancel (dirname.name, oflag, mode); > if (fd == -1 && __glibc_unlikely (errno == EISDIR)) > diff --git a/sysdeps/mach/hurd/bits/mman_ext.h > b/sysdeps/mach/hurd/bits/mman_ext.h > new file mode 100644 > index 00000000..f022826e > --- /dev/null > +++ b/sysdeps/mach/hurd/bits/mman_ext.h > @@ -0,0 +1,25 @@ > +/* System-specific extensions of <sys/mman.h>, Hurd version. > + Copyright (C) 2022 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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _SYS_MMAN_H > +# error "Never include <bits/mman_ext.h> directly; use <sys/mman.h> instead." > +#endif > + > +#ifdef __USE_GNU > +# define SHM_ANON ((const char *) 1) > +#endif /* __USE_GNU */ > -- > 2.39.1 >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.