X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fsave.c;h=f4da52e9bf8086040d5dc9cd816d295fcbac8dfc;hb=2056118835600a7c4e372c796568ddada5824cf6;hp=9fd7d8e73b3641261e3fcb78cd20c4d6b96be032;hpb=33b3b129c1c895c9583494dc75455f56c83ad748;p=sbcl.git diff --git a/src/runtime/save.c b/src/runtime/save.c index 9fd7d8e..f4da52e 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -16,10 +16,14 @@ #include #include #include -#include #include #include "sbcl.h" +#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) +#include "pthreads_win32.h" +#else +#include +#endif #include "runtime.h" #include "os.h" #include "core.h" @@ -34,15 +38,10 @@ #include "genesis/static-symbols.h" #include "genesis/symbol.h" -#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX) -#include "genesis/lutex.h" -#endif - #ifdef LISP_FEATURE_SB_CORE_COMPRESSION # include #endif - /* write_runtime_options uses a simple serialization scheme that * consists of one word of magic, one word indicating whether options * are actually saved, and one word per struct field. */ @@ -80,7 +79,7 @@ write_bytes_to_file(FILE * file, char *addr, long bytes, int compression) { if (compression == COMPRESSION_LEVEL_NONE) { while (bytes > 0) { - long count = fwrite(addr, 1, bytes, file); + sword_t count = fwrite(addr, 1, bytes, file); if (count > 0) { bytes -= count; addr += count; @@ -173,79 +172,6 @@ write_bytes(FILE *file, char *addr, long bytes, os_vm_offset_t file_offset) COMPRESSION_LEVEL_NONE); } -#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX) -/* saving lutexes in the core */ -static void **lutex_addresses; -static long n_lutexes = 0; -static long max_lutexes = 0; - -static long -default_scan_action(lispobj *obj) -{ - return (sizetab[widetag_of(*obj)])(obj); -} - -static long -lutex_scan_action(lispobj *obj) -{ - /* note the address of the lutex */ - if(n_lutexes >= max_lutexes) { - max_lutexes *= 2; - lutex_addresses = realloc(lutex_addresses, max_lutexes * sizeof(void *)); - gc_assert(lutex_addresses); - } - - lutex_addresses[n_lutexes++] = obj; - - return (*sizetab[widetag_of(*obj)])(obj); -} - -typedef long (*scan_table[256])(lispobj *obj); - -static void -scan_objects(lispobj *start, long n_words, scan_table table) -{ - lispobj *end = start + n_words; - lispobj *object_ptr; - long n_words_scanned; - for (object_ptr = start; - object_ptr < end; - object_ptr += n_words_scanned) { - lispobj obj = *object_ptr; - - n_words_scanned = (table[widetag_of(obj)])(object_ptr); - } -} - -static void -scan_for_lutexes(lispobj *addr, long n_words) -{ - static int initialized = 0; - static scan_table lutex_scan_table; - - if (!initialized) { - int i; - - /* allocate a little space to get started */ - lutex_addresses = malloc(16*sizeof(void *)); - gc_assert(lutex_addresses); - max_lutexes = 16; - - /* initialize the mapping table */ - for(i = 0; i < ((sizeof lutex_scan_table)/(sizeof lutex_scan_table[0])); ++i) { - lutex_scan_table[i] = default_scan_action; - } - - lutex_scan_table[LUTEX_WIDETAG] = lutex_scan_action; - - initialized = 1; - } - - /* do the scan */ - scan_objects(addr, n_words, lutex_scan_table); -} -#endif - static void output_space(FILE *file, int id, lispobj *addr, lispobj *end, os_vm_offset_t file_offset, @@ -264,19 +190,14 @@ output_space(FILE *file, int id, lispobj *addr, lispobj *end, bytes = words * sizeof(lispobj); -#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX) - printf("scanning space for lutexes...\n"); - scan_for_lutexes((void *)addr, words); -#endif - - printf("writing %lu bytes from the %s space at 0x%08lx\n", - (unsigned long)bytes, names[id], (unsigned long)addr); + printf("writing %lu bytes from the %s space at 0x%p\n", + bytes, names[id], addr); data = write_and_compress_bytes(file, (char *)addr, bytes, file_offset, core_compression_level); write_lispobj(data, file); - write_lispobj((long)addr / os_vm_page_size, file); + write_lispobj((uword_t)addr / os_vm_page_size, file); write_lispobj((bytes + os_vm_page_size - 1) / os_vm_page_size, file); } @@ -388,19 +309,19 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, #ifdef LISP_FEATURE_GENCGC { - size_t size = (last_free_page*sizeof(long)+os_vm_page_size-1) + size_t size = (last_free_page*sizeof(sword_t)+os_vm_page_size-1) &~(os_vm_page_size-1); - unsigned long *data = calloc(size, 1); + uword_t *data = calloc(size, 1); if (data) { - unsigned long word; - long offset; - int i; + uword_t word; + sword_t offset; + page_index_t i; for (i = 0; i < last_free_page; i++) { /* Thanks to alignment requirements, the two low bits * are always zero, so we can use them to store the * allocation type -- region is always closed, so only * the two low bits of allocation flags matter. */ - word = page_table[i].region_start_offset; + word = page_table[i].scan_start_offset; gc_assert((word & 0x03) == 0); data[i] = word | (0x03 & page_table[i].allocated); } @@ -413,24 +334,6 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, } #endif -#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX) - if(n_lutexes > 0) { - long offset; - printf("writing %ld lutexes to the core...\n", n_lutexes); - write_lispobj(LUTEX_TABLE_CORE_ENTRY_TYPE_CODE, file); - /* word count of the entry */ - write_lispobj(4, file); - /* indicate how many lutexes we saved */ - write_lispobj(n_lutexes, file); - /* save the lutexes */ - offset = write_bytes(file, (char *) lutex_addresses, - n_lutexes * sizeof(*lutex_addresses), - core_start_pos); - - write_lispobj(offset, file); - } -#endif - write_lispobj(END_CORE_ENTRY_TYPE_CODE, file); /* Write a trailing header, ignored when parsing the core normally.