summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2015-02-08 00:02:52 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2015-02-08 00:02:52 +0100
commit5d8ef852fce5c86756bfd05cbbc5b05351dd9ced (patch)
tree16cdd0e3495af2599efcb777c86349e24437dcbb
parentac294f2bed4e0f8b313b08c6356fceb599bff86b (diff)
Address comments
-rw-r--r--.topmsg31
-rw-r--r--hurd/sysvshm.c22
-rw-r--r--hurd/sysvshm.h20
-rw-r--r--sysdeps/mach/hurd/ftok.c9
-rw-r--r--sysdeps/mach/hurd/shmat.c6
-rw-r--r--sysdeps/mach/hurd/shmctl.c5
-rw-r--r--sysdeps/mach/hurd/shmdt.c3
-rw-r--r--sysdeps/mach/hurd/shmget.c5
8 files changed, 72 insertions, 29 deletions
diff --git a/.topmsg b/.topmsg
index fd15d3d6a1..755717e443 100644
--- a/.topmsg
+++ b/.topmsg
@@ -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);