From afcfb8b5da57ffc36f9029e0962cc64ba2318484 Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Sat, 3 Jan 2009 15:59:44 +0000 Subject: [PATCH] 1.0.24.13: solve overlapping mmap and munmap slices on HPUX * Patch by Larry Valkama. --- src/runtime/cheneygc.c | 4 ++++ src/runtime/coreparse.c | 40 +++++++++++++++++++++++++++++++++++++++- src/runtime/purify.c | 3 +++ version.lisp-expr | 2 +- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index 2f4e9d0..4253892 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -239,6 +239,10 @@ collect_garbage(generation_index_t ignore) /* Maybe FIXME: it's possible that we could significantly reduce * RSS by zeroing the from_space or madvise(MADV_DONTNEED) or * similar os-dependent tricks here */ +#ifdef LISP_FEATURE_HPUX + /* hpux cant handle unmapping areas that are not 100% mapped */ + clear_auto_gc_trigger(); +#endif os_zero((os_vm_address_t) from_space, (os_vm_size_t) dynamic_space_size); diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 5fd590e..e8a513b 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -145,6 +145,41 @@ lose: return -1; } +/* If more platforms doesn't support overlapping mmap rename this + * def to something like ifdef nommapoverlap */ +/* currently hpux only */ +#ifdef LISP_FEATURE_HPUX +os_vm_address_t copy_core_bytes(int fd, os_vm_offset_t offset, + os_vm_address_t addr, int len) +{ + unsigned char buf[4096]; + int c,x; + int old_fd = lseek(fd, 0, SEEK_CUR); + + if(len & (4096-1)){ + fprintf(stderr, "cant copy a slice of core because slice-length is not of page size(4096)\n"); + exit(-1); + } + if(old_fd < 0){ + fprintf(stderr, "cant perform lseek() on corefile\n"); + } + lseek(fd, offset, SEEK_SET); + if(fd < 0){ + fprintf(stderr, "cant perform lseek(%u,%lu,SEEK_SET) on corefile\n", fd, offset); + } + for(x = 0; x < len; x += 4096){ + c = read(fd, buf, 4096); + if(c != 4096){ + fprintf(stderr, "cant read memory area from corefile at position %lu, got %d\n", offset + x, c); + exit(-1); + } + memcpy(addr+x, buf, 4096); + } + os_flush_icache(addr, len); + return addr; +} +#endif + static void process_directory(int fd, lispobj *ptr, int count, os_vm_offset_t file_offset) { @@ -160,12 +195,15 @@ process_directory(int fd, lispobj *ptr, int count, os_vm_offset_t file_offset) (os_vm_address_t) (os_vm_page_size * entry->address); lispobj *free_pointer = (lispobj *) addr + entry->nwords; unsigned long len = os_vm_page_size * entry->page_count; - if (len != 0) { os_vm_address_t real_addr; FSHOW((stderr, "/mapping %ld(0x%lx) bytes at 0x%lx\n", (long)len, (long)len, (unsigned long)addr)); +#ifdef LISP_FEATURE_HPUX + real_addr = copy_core_bytes(fd, offset + file_offset, addr, len); +#else real_addr = os_map(fd, offset + file_offset, addr, len); +#endif if (real_addr != addr) { lose("file mapped in wrong place! " "(0x%08x != 0x%08lx)\n", diff --git a/src/runtime/purify.c b/src/runtime/purify.c index 3440b2f..59acf19 100644 --- a/src/runtime/purify.c +++ b/src/runtime/purify.c @@ -1022,6 +1022,9 @@ purify(lispobj static_roots, lispobj read_only_roots) printf(" cleanup"); fflush(stdout); #endif +#ifdef LISP_FEATURE_HPUX + clear_auto_gc_trigger(); /* restore mmap as it was given by os */ +#endif os_zero((os_vm_address_t) current_dynamic_space, (os_vm_size_t) dynamic_space_size); diff --git a/version.lisp-expr b/version.lisp-expr index 4f0c766..7c1093e 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.24.12" +"1.0.24.13" -- 1.7.10.4