Alexandre Julliard : libwine: Better memory reservation algorithm for platforms that use try_mmap_fixed.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 20 16:03:51 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 0e2fcd4ba836d523bbad59cbeab12f5de1a86ca2
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=0e2fcd4ba836d523bbad59cbeab12f5de1a86ca2

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jun 20 19:07:03 2006 +0200

libwine: Better memory reservation algorithm for platforms that use try_mmap_fixed.

---

 libs/wine/mmap.c |   29 ++++++++++++++++++++++++++---
 1 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c
index bbfaea2..16bf302 100644
--- a/libs/wine/mmap.c
+++ b/libs/wine/mmap.c
@@ -229,7 +229,7 @@ static inline int mmap_reserve( void *ad
 
 #ifdef MAP_TRYFIXED
     flags |= MAP_TRYFIXED;
-#elif defined(__svr4__) || defined(__NetBSD__) || defined(__APPLE__)
+#elif defined(__APPLE__)
     return try_mmap_fixed( addr, size, PROT_NONE, flags, get_fdzero(), 0 );
 #endif
     ptr = mmap( addr, size, PROT_NONE, flags, get_fdzero(), 0 );
@@ -242,12 +242,34 @@ #endif
  *           reserve_area
  *
  * Reserve as much memory as possible in the given area.
- * FIXME: probably needs a different algorithm for Solaris
  */
 static void reserve_area( void *addr, void *end )
 {
     size_t size = (char *)end - (char *)addr;
 
+#if (defined(__svr4__) || defined(__NetBSD__)) && !defined(MAP_TRYFIXED)
+    /* try_mmap_fixed is inefficient when using vfork, so we need a different algorithm here */
+    /* we assume no other thread is running at this point */
+    size_t i, pagesize = getpagesize();
+    char vec;
+
+    while (size)
+    {
+        for (i = 0; i < size; i += pagesize)
+            if (mincore( (caddr_t)addr + i, pagesize, &vec ) != -1) break;
+
+        i &= ~granularity_mask;
+        if (i && mmap( addr, i, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
+                       get_fdzero(), 0 ) != (void *)-1)
+            wine_mmap_add_reserved_area( addr, i );
+
+        i += granularity_mask + 1;
+        if ((char *)addr + i < (char *)addr) break;  /* overflow */
+        addr = (char *)addr + i;
+        if (addr >= end) break;
+        size = (char *)end - (char *)addr;
+    }
+#else
     if (!size) return;
 
     if (mmap_reserve( addr, size ))
@@ -261,6 +283,7 @@ static void reserve_area( void *addr, vo
         reserve_area( addr, (char *)addr + new_size );
         reserve_area( (char *)addr + new_size, end );
     }
+#endif
 }
 
 
@@ -298,7 +321,7 @@ void mmap_init(void)
 #if defined(__i386__) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__)  /* commented out until FreeBSD gets fixed */
     char stack;
     char * const stack_ptr = &stack;
-    char *user_space_limit = (char *)0x80000000;
+    char *user_space_limit = (char *)0x7ffe0000;
 
     /* check for a reserved area starting at the user space limit */
     /* to avoid wasting time trying to allocate it again */




More information about the wine-cvs mailing list