This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch, roland/locarchive-mmap, created. glibc-2.14-333-g3eb8a4c


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, roland/locarchive-mmap has been created
        at  3eb8a4c93ba7a1dcf101e9b38e787f6c06f37ef2 (commit)

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=3eb8a4c93ba7a1dcf101e9b38e787f6c06f37ef2

commit 3eb8a4c93ba7a1dcf101e9b38e787f6c06f37ef2
Author: Roland McGrath <mcgrathr@chromium.org>
Date:   Mon Sep 19 11:32:27 2011 -0700

    Clean up locarchive mmap reservation code.

diff --git a/ChangeLog b/ChangeLog
index 4288477..72cd605 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -163,6 +163,9 @@
 
 2011-09-19  Roland McGrath  <roland@hack.frob.com>
 
+	* locale/programs/locarchive.c (prepare_address_space): New function.
+	(create_archive, enlarge_archive, open_archive): Use it.
+
 	* sysdeps/posix/spawni.c (script_execute): Always define it.
 	It will be optimized away if unused.
 	(maybe_script_execute): New function.
diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c
index 770a731..5069265 100644
--- a/locale/programs/locarchive.c
+++ b/locale/programs/locarchive.c
@@ -74,6 +74,29 @@ static const char *locnames[] =
 /* Size of the reserved address space area.  */
 #define RESERVE_MMAP_SIZE	512 * 1024 * 1024
 
+/* To prepare for enlargements of the mmaped area reserve some address
+   space.  On some machines, being a file mapping rather than an anonymous
+   mapping affects the address selection.  So do this mapping from the
+   actual file, even though it's only a dummy to reserve address space.  */
+static void *
+prepare_address_space (int fd, size_t total, size_t *reserved, int *xflags)
+{
+  if (total < RESERVE_MMAP_SIZE)
+    {
+      void *p = mmap64 (NULL, RESERVE_MMAP_SIZE, PROT_NONE, MAP_SHARED, fd, 0);
+      if (p != MAP_FAILED)
+        {
+          *reserved = RESERVE_MMAP_SIZE;
+          *xflags = MAP_FIXED;
+          return p;
+        }
+    }
+
+  *reserved = total;
+  *xflags = 0;
+  return NULL;
+}
+
 
 static void
 create_archive (const char *archivefname, struct locarhandle *ah)
@@ -81,7 +104,6 @@ create_archive (const char *archivefname, struct locarhandle *ah)
   int fd;
   char fname[strlen (archivefname) + sizeof (".XXXXXX")];
   struct locarhead head;
-  void *p;
   size_t total;
 
   strcpy (stpcpy (fname, archivefname), ".XXXXXX");
@@ -129,19 +151,9 @@ create_archive (const char *archivefname, struct locarhandle *ah)
       error (EXIT_FAILURE, errval, _("cannot resize archive file"));
     }
 
-  /* To prepare for enlargements of the mmaped area reserve some
-     address space.  */
-  size_t reserved = RESERVE_MMAP_SIZE;
-  int xflags = 0;
-  if (total < reserved
-      && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON,
-		       -1, 0)) != MAP_FAILED))
-    xflags = MAP_FIXED;
-  else
-    {
-      p = NULL;
-      reserved = total;
-    }
+  size_t reserved;
+  int xflags;
+  void *p = prepare_address_space (fd, total, &reserved, &xflags);
 
   /* Map the header and all the administration data structures.  */
   p = mmap64 (p, total, PROT_READ | PROT_WRITE, MAP_SHARED | xflags, fd, 0);
@@ -297,7 +309,6 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head)
   int fd;
   struct locarhead newhead;
   size_t total;
-  void *p;
   unsigned int cnt, loccnt;
   struct namehashent *oldnamehashtab;
   struct locarhandle new_ah;
@@ -390,19 +401,9 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head)
       error (EXIT_FAILURE, errval, _("cannot resize archive file"));
     }
 
-  /* To prepare for enlargements of the mmaped area reserve some
-     address space.  */
-  size_t reserved = RESERVE_MMAP_SIZE;
-  int xflags = 0;
-  if (total < reserved
-      && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON,
-		       -1, 0)) != MAP_FAILED))
-    xflags = MAP_FIXED;
-  else
-    {
-      p = NULL;
-      reserved = total;
-    }
+  size_t reserved;
+  int xflags;
+  void *p = prepare_address_space (fd, total, &reserved, &xflags);
 
   /* Map the header and all the administration data structures.  */
   p = mmap64 (p, total, PROT_READ | PROT_WRITE, MAP_SHARED | xflags, fd, 0);
@@ -605,20 +606,9 @@ open_archive (struct locarhandle *ah, bool readonly)
   ah->fd = fd;
   ah->mmaped = st.st_size;
 
-  /* To prepare for enlargements of the mmaped area reserve some
-     address space.  */
-  size_t reserved = RESERVE_MMAP_SIZE;
-  int xflags = 0;
-  void *p;
-  if (st.st_size < reserved
-      && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON,
-		       -1, 0)) != MAP_FAILED))
-    xflags = MAP_FIXED;
-  else
-    {
-      p = NULL;
-      reserved = st.st_size;
-    }
+  size_t reserved;
+  int xflags;
+  void *p = prepare_address_space (fd, st.st_size, &reserved, &xflags);
 
   /* Map the entire file.  We might need to compare the category data
      in the file with the newly added data.  */

-----------------------------------------------------------------------


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]