From: Nikodemus S. <de...@us...> - 2009-01-03 15:59:57
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv31244/src/runtime Modified Files: cheneygc.c coreparse.c purify.c Log Message: 1.0.24.13: solve overlapping mmap and munmap slices on HPUX * Patch by Larry Valkama. Index: cheneygc.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/cheneygc.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- cheneygc.c 2 Dec 2008 19:15:30 -0000 1.28 +++ cheneygc.c 3 Jan 2009 15:59:44 -0000 1.29 @@ -239,6 +239,10 @@ /* 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); Index: coreparse.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/coreparse.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- coreparse.c 17 Oct 2008 12:49:36 -0000 1.41 +++ coreparse.c 3 Jan 2009 15:59:44 -0000 1.42 @@ -145,6 +145,41 @@ 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 @@ (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", Index: purify.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/purify.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- purify.c 15 Aug 2008 10:58:16 -0000 1.72 +++ purify.c 3 Jan 2009 15:59:44 -0000 1.73 @@ -1022,6 +1022,9 @@ 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); |