libwine: allow multiple reserve areas

Mike McCormack mike at codeweavers.com
Wed Apr 28 05:09:07 CDT 2004


This patch allows the loader to inform libwine of multiple areas of 
memory that may have been reseved before wine started.  Currently only a 
single area is allowed.

Mike


ChangeLog:
* allow multiple reserve areas
-------------- next part --------------
Index: libs/wine/port.c
===================================================================
RCS file: /home/wine/wine/libs/wine/port.c,v
retrieving revision 1.8
diff -u -r1.8 port.c
--- libs/wine/port.c	5 Feb 2004 02:01:35 -0000	1.8
+++ libs/wine/port.c	28 Apr 2004 09:07:02 -0000
@@ -150,36 +150,63 @@
 #error You must implement wine_switch_to_stack for your platform
 #endif
 
+struct reserve_area
+{
+    char *base;
+    size_t size;
+    struct reserve_area *next;
+};
 
-static char *pe_area;
-static size_t pe_area_size;
+struct reserve_area *reserve_list;
 
 /***********************************************************************
- *		wine_set_pe_load_area
+ *		wine_reserve_area
  *
- * Define the reserved area to use for loading the main PE binary.
+ * Define a reserved area (for the PE binary and system heap)
+ * These function are not thread safe, so we assume that
+ *  they're called before any threads are started, and all the
+ *  reserve areas are free'd.
  */
-void wine_set_pe_load_area( void *base, size_t size )
+void wine_reserve_area( void *base, size_t size )
 {
+    struct reserve_area *area;
     unsigned int page_mask = getpagesize() - 1;
     char *end = (char *)base + size;
 
-    pe_area = (char *)(((unsigned long)base + page_mask) & ~page_mask);
-    pe_area_size = (end - pe_area) & ~page_mask;
+    area = malloc( sizeof (struct reserve_area) );
+
+    area->base = (char *)(((unsigned long)base + page_mask) & ~page_mask);
+    area->size = (end - area->base) & ~page_mask;
+
+    area->next = reserve_list;
+    reserve_list = area;
 }
 
 
 /***********************************************************************
- *		wine_free_pe_load_area
+ *		wine_free_area
  *
- * Free the reserved area to use for loading the main PE binary.
+ * Free a reserved area.
  */
-void wine_free_pe_load_area(void)
+int wine_free_area( char *start, size_t size )
 {
+    struct reserve_area *area, **p;
+
+    for( p = &reserve_list; (area = *p); p = &area->next )
+        if( start >= area->base && start + size <= area->base + area->size)
+            break;
+
+    if( !area )
+        return 0;
+
+    *p = area->next;
+
 #ifdef HAVE_MMAP
-    if (pe_area) munmap( pe_area, pe_area_size );
+    munmap( area->base, area->size );
 #endif
-    pe_area = NULL;
+
+    free( area );
+    return 1;
 }
 
 
@@ -296,13 +323,8 @@
     flags |= MAP_PRIVATE;
 #endif
 
-    if (pe_area && start &&
-        (char *)start >= pe_area &&
-        (char *)start + size <= pe_area + pe_area_size)
-    {
-        wine_free_pe_load_area();
+    if ( start && reserve_list && wine_free_area(start, size) )
         flags |= MAP_FIXED;
-    }
 
     if (!(flags & MAP_FIXED))
     {
Index: libs/wine/wine.def
===================================================================
RCS file: /home/wine/wine/libs/wine/wine.def,v
retrieving revision 1.10
diff -u -r1.10 wine.def
--- libs/wine/wine.def	5 Feb 2004 02:01:35 -0000	1.10
+++ libs/wine/wine.def	28 Apr 2004 09:07:02 -0000
@@ -64,5 +64,5 @@
     wine_pthread_init_thread
     wine_set_fs
     wine_set_gs
-    wine_set_pe_load_area
+    wine_reserve_area
     wine_switch_to_stack
Index: libs/wine/wine.map
===================================================================
RCS file: /home/wine/wine/libs/wine/wine.map,v
retrieving revision 1.1
diff -u -r1.1 wine.map
--- libs/wine/wine.map	12 Feb 2004 22:54:00 -0000	1.1
+++ libs/wine/wine.map	28 Apr 2004 09:07:02 -0000
@@ -64,7 +64,7 @@
     wine_pthread_init_thread;
     wine_set_fs;
     wine_set_gs;
-    wine_set_pe_load_area;
+    wine_reserve_area;
     wine_switch_to_stack;
 
   local: *;
Index: dlls/kernel/process.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/process.c,v
retrieving revision 1.55
diff -u -r1.55 process.c
--- dlls/kernel/process.c	28 Apr 2004 01:04:24 -0000	1.55
+++ dlls/kernel/process.c	28 Apr 2004 09:07:03 -0000
@@ -917,8 +917,6 @@
     }
 
  found:
-    wine_free_pe_load_area();  /* the main binary is loaded, we don't need this anymore */
-
     /* build command line */
     set_library_wargv( __wine_main_argv );
     if (!build_command_line( __wine_main_wargv )) goto error;


More information about the wine-patches mailing list