Commit afcfb8b5 authored by Nikodemus Siivola's avatar Nikodemus Siivola
Browse files

1.0.24.13: solve overlapping mmap and munmap slices on HPUX

 * Patch by Larry Valkama.
parent dcd86042
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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);

+39 −1
Original line number Diff line number Diff line
@@ -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",
+3 −0
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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"