static void fwrite_header(FILE* fp) { fwrite_no_fail(&MAGIC_CONSTANT, sizeof MAGIC_CONSTANT, 1, fp); size_t revlen = strlen(BuildInfo_kRevision); fwrite_no_fail(&revlen, sizeof revlen, 1, fp); fwrite_no_fail(BuildInfo_kRevision, sizeof(char), revlen, fp); }
void hh_save(value out_filename) { CAMLparam1(out_filename); FILE* fp = fopen(String_val(out_filename), "wb"); fwrite_header(fp); fwrite_no_fail(&heap_init_size, sizeof heap_init_size, 1, fp); /* * Format of the compressed shared memory: * LZ4 can only work in chunks of 2GB, so we compress each chunk individually, * and write out each one as * [compressed size of chunk][uncompressed size of chunk][chunk] * A compressed size of zero indicates the end of the compressed section. */ char* chunk_start = save_start(); int compressed_size = 0; while (chunk_start < *heap) { uintptr_t remaining = *heap - chunk_start; uintptr_t chunk_size = LZ4_MAX_INPUT_SIZE < remaining ? LZ4_MAX_INPUT_SIZE : remaining; char* compressed = malloc(chunk_size * sizeof(char)); assert(compressed != NULL); compressed_size = LZ4_compressHC(chunk_start, compressed, chunk_size); assert(compressed_size > 0); fwrite_no_fail(&compressed_size, sizeof compressed_size, 1, fp); fwrite_no_fail(&chunk_size, sizeof chunk_size, 1, fp); fwrite_no_fail((void*)compressed, 1, compressed_size, fp); chunk_start += chunk_size; free(compressed); } compressed_size = 0; fwrite_no_fail(&compressed_size, sizeof compressed_size, 1, fp); fclose(fp); CAMLreturn0; }
void hh_save_dep_table(value out_filename) { CAMLparam1(out_filename); FILE* fp = fopen(String_val(out_filename), "wb"); fwrite_header(fp); int compressed_size = 0; assert(LZ4_MAX_INPUT_SIZE >= DEP_SIZE_B); char* compressed = malloc(DEP_SIZE_B); assert(compressed != NULL); compressed_size = LZ4_compressHC((char*)deptbl, compressed, DEP_SIZE_B); assert(compressed_size > 0); fwrite_no_fail(&compressed_size, sizeof compressed_size, 1, fp); fwrite_no_fail((void*)compressed, 1, compressed_size, fp); free(compressed); fclose(fp); CAMLreturn0; }