Update of /cvsroot/sbcl/sbcl/src/runtime
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7399/src/runtime
Modified Files:
Tag: gencgc-pagetable-branch
save.c coreparse.c
Log Message:
0.9.3.8.gc.5:
Fix a couple of problems exposed when dumping really big cores.
* Pad the page table in the core file to the next os_vm_page_size
boundary.
* Only save the interesting bits of the page table in the core file
to reduce bloat.
Index: save.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/save.c,v
retrieving revision 1.20.2.2
retrieving revision 1.20.2.3
diff -u -d -r1.20.2.2 -r1.20.2.3
--- save.c 31 Jul 2005 02:07:04 -0000 1.20.2.2
+++ save.c 16 Aug 2005 19:10:31 -0000 1.20.2.3
@@ -173,13 +173,22 @@
#ifdef LISP_FEATURE_GENCGC
{
- size_t size = last_free_page*sizeof(struct page);
- long offset;
- write_lispobj(3880, file);
- write_lispobj(4, file);
- write_lispobj(size, file);
- offset = write_bytes(file, (char *) page_table, size * N_WORD_BYTES);
- write_lispobj(offset, file);
+ size_t size = (last_free_page*sizeof(long)+os_vm_page_size-1)
+ &~(os_vm_page_size-1);
+ long *data = calloc(size, 1);
+ if (data) {
+ long offset;
+ int i;
+ for (i = 0; i < last_free_page; i++) {
+ data[i] = page_table[i].first_object_offset;
+ }
+ fprintf(stderr, "lfp=%d\n", last_free_page);
+ write_lispobj(3880, file);
+ write_lispobj(4, file);
+ write_lispobj(size, file);
+ offset = write_bytes(file, (char *) data, size);
+ write_lispobj(offset, file);
+ }
}
#endif
Index: coreparse.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/coreparse.c,v
retrieving revision 1.25.2.1
retrieving revision 1.25.2.2
diff -u -d -r1.25.2.1 -r1.25.2.2
--- coreparse.c 31 Jul 2005 02:07:02 -0000 1.25.2.1
+++ coreparse.c 16 Aug 2005 19:10:32 -0000 1.25.2.2
@@ -233,13 +233,20 @@
size_t fdoffset = (*(ptr+1) + 1) * (os_vm_page_size);
size_t offset = 0;
long bytes_read;
+ long data[4096];
lseek(fd, fdoffset, SEEK_SET);
- while ((bytes_read = read(fd, (char*) page_table + offset, size))
- > 0)
+ while ((bytes_read = read(fd, data, (size < 4096 ? size : 4096 )))
+ > 0)
{
- offset += bytes_read;
+ int i = 0;
size -= bytes_read;
+ while (bytes_read) {
+ bytes_read -= sizeof(long);
+ page_table[offset++].first_object_offset = data[i++];
+ }
}
+ fprintf(stderr, "offset=%d\n", offset);
+ page_table[0].gen = 0;
break;
}
default:
|