1.0.24.13: solve overlapping mmap and munmap slices on HPUX
authorNikodemus Siivola <nikodemus@random-state.net>
Sat, 3 Jan 2009 15:59:44 +0000 (15:59 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sat, 3 Jan 2009 15:59:44 +0000 (15:59 +0000)
 * Patch by Larry Valkama.

src/runtime/cheneygc.c
src/runtime/coreparse.c
src/runtime/purify.c
version.lisp-expr

index 2f4e9d0..4253892 100644 (file)
@@ -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);
 
index 5fd590e..e8a513b 100644 (file)
@@ -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",
index 3440b2f..59acf19 100644 (file)
@@ -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);
index 4f0c766..7c1093e 100644 (file)
@@ -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"