Mercurial > emacs
changeset 52011:8bbd4454be32
unexmacosx.c: Sort and merge unexec regions before dumping them.
author | Andrew Choi <akochoi@shaw.ca> |
---|---|
date | Tue, 22 Jul 2003 17:54:50 +0000 |
parents | 08ca5a28493e |
children | d116f572d76b |
files | src/ChangeLog src/unexmacosx.c |
diffstat | 2 files changed, 48 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Tue Jul 22 17:51:57 2003 +0000 +++ b/src/ChangeLog Tue Jul 22 17:54:50 2003 +0000 @@ -1,3 +1,9 @@ +2003-07-22 Andrew Choi <akochoi@shaw.ca> + + * unexmacosx.c (unexec_regions_sort_compare): + (unexec_regions_merge): New functions. Sort and merge unexec + regions before dumping them. + 2003-07-22 Dave Love <fx@gnu.org> * xfns.c [HAVE_PNG]: Consider both png.h and libpng/png.h.
--- a/src/unexmacosx.c Tue Jul 22 17:51:57 2003 +0000 +++ b/src/unexmacosx.c Tue Jul 22 17:54:50 2003 +0000 @@ -364,7 +364,7 @@ } -#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 @@ 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 @@ read_load_commands (); find_emacs_zone_regions (); + unexec_regions_merge (); in_dumped_exec = 1;