From: Andrew Choi Date: Tue, 22 Jul 2003 17:54:50 +0000 (+0000) Subject: unexmacosx.c: Sort and merge unexec regions before dumping them. X-Git-Tag: ttn-vms-21-2-B4~9262 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1dd7ccf2804ea436ffca8d92b9617b21d623e7f5;p=emacs.git unexmacosx.c: Sort and merge unexec regions before dumping them. --- diff --git a/src/ChangeLog b/src/ChangeLog index b99d5b4a2ba..e9ddaf38aa8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2003-07-22 Andrew Choi + + * unexmacosx.c (unexec_regions_sort_compare): + (unexec_regions_merge): New functions. Sort and merge unexec + regions before dumping them. + 2003-07-22 Dave Love * xfns.c [HAVE_PNG]: Consider both png.h and libpng/png.h. diff --git a/src/unexmacosx.c b/src/unexmacosx.c index ac87f9e6c63..c84e5c95d03 100644 --- a/src/unexmacosx.c +++ b/src/unexmacosx.c @@ -364,7 +364,7 @@ build_region_list () } -#define MAX_UNEXEC_REGIONS 30 +#define MAX_UNEXEC_REGIONS 200 int num_unexec_regions; vm_range_t unexec_regions[MAX_UNEXEC_REGIONS]; @@ -403,6 +403,46 @@ find_emacs_zone_regions () unexec_regions_recorder); } +static int +unexec_regions_sort_compare (const void *a, const void *b) +{ + vm_address_t aa = ((vm_range_t *) a)->address; + vm_address_t bb = ((vm_range_t *) b)->address; + + if (aa < bb) + return -1; + else if (aa > bb) + return 1; + else + return 0; +} + +static void +unexec_regions_merge () +{ + int i, n; + vm_range_t r; + + qsort (unexec_regions, num_unexec_regions, sizeof (unexec_regions[0]), + &unexec_regions_sort_compare); + n = 0; + r = unexec_regions[0]; + for (i = 1; i < num_unexec_regions; i++) + { + if (r.address + r.size == unexec_regions[i].address) + { + r.size += unexec_regions[i].size; + } + else + { + unexec_regions[n++] = r; + r = unexec_regions[i]; + } + } + unexec_regions[n++] = r; + num_unexec_regions = n; +} + /* More informational messages routines. */ @@ -863,6 +903,7 @@ unexec (char *outfile, char *infile, void *start_data, void *start_bss, read_load_commands (); find_emacs_zone_regions (); + unexec_regions_merge (); in_dumped_exec = 1;