diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-02-08 00:02:52 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-02-08 00:02:52 +0100 |
commit | 5d8ef852fce5c86756bfd05cbbc5b05351dd9ced (patch) | |
tree | 16cdd0e3495af2599efcb777c86349e24437dcbb | |
parent | ac294f2bed4e0f8b313b08c6356fceb599bff86b (diff) |
Address comments
-rw-r--r-- | .topmsg | 31 | ||||
-rw-r--r-- | hurd/sysvshm.c | 22 | ||||
-rw-r--r-- | hurd/sysvshm.h | 20 | ||||
-rw-r--r-- | sysdeps/mach/hurd/ftok.c | 9 | ||||
-rw-r--r-- | sysdeps/mach/hurd/shmat.c | 6 | ||||
-rw-r--r-- | sysdeps/mach/hurd/shmctl.c | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/shmdt.c | 3 | ||||
-rw-r--r-- | sysdeps/mach/hurd/shmget.c | 5 |
8 files changed, 72 insertions, 29 deletions
@@ -6,10 +6,37 @@ Subject: [PATCH] Implement SysV shared memory for GNU/Hurd. * hurd/Makefile (routines): Add sysvshm. * hurd/sysvshm.h: New file. * hurd/sysvshm.c: New file. - * sysdeps/mach/hurd/bits/stat.h (S_IMMAP0): New macro. - (S_ISPARE): Unset the S_IMMAP0 flag. * sysdeps/mach/hurd/ftok.c: New file. * sysdeps/mach/hurd/shmat.c: New file. * sysdeps/mach/hurd/shmctl.c: New file. * sysdeps/mach/hurd/shmdt.c: New file. + * sysdeps/mach/hurd/shmget.c: New file. * sysdeps/mach/hurd/bits/posix_opt.h: Define _XOPEN_SHM to 1. + +TODO: +“ +> + char filename[sizeof (SHM_DIR) - 1 + SHM_NAMEMAX]; +> + struct stat statbuf; +> + +> + sprintf (filename, SHM_DIR SHM_NAMEPRI, id); +> + /* SysV requires read access for IPC_STAT. */ +> + fd = __open (filename, O_NORW); +> + if (fd < 0) +> + { +> + if (errno == ENOENT) +> + errno = EINVAL; +> + return -1; +> + } + +Since this is repeated in more than one function, put it into an +internal subroutine. Then we have only one place doing the +name-generation logic. +” + +“ +> + case IPC_RMID: +> + res = __unlink (filename); +> + /* FIXME: Check error (mapping ENOENT to EINVAL). */ + +Fix it. +” diff --git a/hurd/sysvshm.c b/hurd/sysvshm.c index 945ac1c24e..5d538a6373 100644 --- a/hurd/sysvshm.c +++ b/hurd/sysvshm.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2005-2015 Free Software Foundation, Inc. +/* SysV shared memory for Hurd. + Copyright (C) 2005-2015 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 @@ -41,7 +42,7 @@ struct sysvshm_attach }; /* List of attachments. */ -static struct sysvshm_attach *attach_list; +static struct sysvshm_attach *sysvshm_list; /* A lock to protect the linked list of shared memory attachments. */ static struct mutex sysvshm_lock = MUTEX_INITIALIZER; @@ -54,30 +55,30 @@ __sysvshm_add (void *addr, size_t size) struct sysvshm_attach *shm; shm = malloc (sizeof (*shm)); - if (!shm) + if (shm == NULL) return errno; __mutex_lock (&sysvshm_lock); shm->addr = addr; shm->size = size; - shm->next = attach_list; - attach_list = shm; + shm->next = sysvshm_list; + sysvshm_list = shm; __mutex_unlock (&sysvshm_lock); return 0; } -/* Removes a segment attachment. Returns its size if found, or EINVAL - otherwise. */ +/* Removes a segment attachment. On success, returns 0 and sets *SIZE to its + size. Returns EINVAL if not found. */ error_t __sysvshm_remove (void *addr, size_t *size) { struct sysvshm_attach *shm; - struct sysvshm_attach **pshm = &attach_list; + struct sysvshm_attach **pshm = &sysvshm_list; __mutex_lock (&sysvshm_lock); - shm = attach_list; - while (shm) + shm = sysvshm_list; + while (shm != NULL) { shm = *pshm; if (shm->addr == addr) @@ -85,6 +86,7 @@ __sysvshm_remove (void *addr, size_t *size) *pshm = shm->next; *size = shm->size; __mutex_unlock (&sysvshm_lock); + free (shm); return 0; } pshm = &shm->next; diff --git a/hurd/sysvshm.h b/hurd/sysvshm.h index 5faa0f005f..8b9c29ff46 100644 --- a/hurd/sysvshm.h +++ b/hurd/sysvshm.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2005-2015 Free Software Foundation, Inc. +/* SysV shared memory for Hurd. + Copyright (C) 2005-2015 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 @@ -15,16 +16,19 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _HURD_SYSVSHM_H +#define _HURD_SYSVSHM_H + #include <paths.h> #include <hurd.h> /* The area (from top to bottom) that is used for private keys. These are all keys that have the second highest bit set. */ -#define SHM_PRIV_KEY_START INT_MAX -#define SHM_PRIV_KEY_END ((INT_MAX / 2) + 1) +#define SHM_PRIV_KEY_START INT_MAX +#define SHM_PRIV_KEY_END ((INT_MAX / 2) + 1) -#define SHM_PREFIX "shm-" -#define SHM_DIR _PATH_DEV "shm/" +#define SHM_PREFIX "sysvshm-" +#define SHM_DIR _PATH_DEV "shm/" /* The maximum number of characters in a shared memory segment file name. 32 is the max number of characters in a 128 bit number in hex. */ @@ -41,6 +45,8 @@ /* Adds a segment attachment. */ error_t __sysvshm_add (void *addr, size_t size); -/* Removes a segment attachment. Returns its size if found, or EINVAL - otherwise. */ +/* Removes a segment attachment. On success, returns 0 and sets *SIZE to its + size. Returns EINVAL if not found. */ error_t __sysvshm_remove (void *addr, size_t *size); + +#endif /* sysvshm.h */ diff --git a/sysdeps/mach/hurd/ftok.c b/sysdeps/mach/hurd/ftok.c index 69e6bf58ff..a6aba15c86 100644 --- a/sysdeps/mach/hurd/ftok.c +++ b/sysdeps/mach/hurd/ftok.c @@ -1,6 +1,6 @@ -/* Copyright (C) 1995-2015 Free Software Foundation, Inc. +/* SysV ftok for Hurd. + Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,8 +21,9 @@ /* In the Hurd, we use the second-to-most-significant bit as flag for - private keys. We use a different order of the components so that - the biggest one---the inode number---is affected by this. */ + private keys. We use an order of the components different from the generic + code in sysvipc/ftok.c so that the biggest one--the inode number--is + affected by this. */ key_t ftok (pathname, proj_id) diff --git a/sysdeps/mach/hurd/shmat.c b/sysdeps/mach/hurd/shmat.c index a8900e0a3f..6bc88705b8 100644 --- a/sysdeps/mach/hurd/shmat.c +++ b/sysdeps/mach/hurd/shmat.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2005-2015 Free Software Foundation, Inc. +/* SysV shmat for Hurd. + Copyright (C) 2005-2015 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 @@ -53,7 +54,9 @@ __shmat (int shmid, const void *shmaddr, int shmflg) res = __fstat (fd, &statbuf); if (res < 0) { + err = errno; __close (fd); + errno = err; return (void *) -1; } @@ -68,6 +71,7 @@ __shmat (int shmid, const void *shmaddr, int shmflg) if (err) { munmap (addr, statbuf.st_size); + errno = err; return (void *) -1; } diff --git a/sysdeps/mach/hurd/shmctl.c b/sysdeps/mach/hurd/shmctl.c index aee5e15a56..a991a0c8de 100644 --- a/sysdeps/mach/hurd/shmctl.c +++ b/sysdeps/mach/hurd/shmctl.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2005-2015 Free Software Foundation, Inc. +/* SysV shmctl for Hurd. + Copyright (C) 2005-2015 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 @@ -26,7 +27,7 @@ #include "sysvshm.h" -/* Provide operations to control over shared memory segments. */ +/* Provide operations to control shared memory segments. */ int __shmctl (int id, int cmd, struct shmid_ds *buf) { diff --git a/sysdeps/mach/hurd/shmdt.c b/sysdeps/mach/hurd/shmdt.c index 245fd55a89..988fab8ee6 100644 --- a/sysdeps/mach/hurd/shmdt.c +++ b/sysdeps/mach/hurd/shmdt.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2005-2015 Free Software Foundation, Inc. +/* SysV shmdt for Hurd. + Copyright (C) 2005-2015 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 diff --git a/sysdeps/mach/hurd/shmget.c b/sysdeps/mach/hurd/shmget.c index 9b580949b8..2065b41989 100644 --- a/sysdeps/mach/hurd/shmget.c +++ b/sysdeps/mach/hurd/shmget.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2005-2015 Free Software Foundation, Inc. +/* SysV shmget for Hurd. + Copyright (C) 2005-2015 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 @@ -94,7 +95,7 @@ get_exclusive (int shmflags, size_t size, key_t *r_key, int *r_fd) key = SHM_PRIV_KEY_START; /* Try to link the shared memory segment into the filesystem - (exclusively). Private segments have negative keys. */ + (exclusively). */ do { sprintf (filename, SHM_NAMEPRI, key); |