VM: simplified save_image, goto works here!
parent
ffc441ad63
commit
40eb664425
38
vm/image.cpp
38
vm/image.cpp
|
@ -198,18 +198,8 @@ void factor_vm::load_image(vm_parameters* p) {
|
||||||
/* Save the current image to disk */
|
/* Save the current image to disk */
|
||||||
bool factor_vm::save_image(const vm_char* saving_filename,
|
bool factor_vm::save_image(const vm_char* saving_filename,
|
||||||
const vm_char* filename) {
|
const vm_char* filename) {
|
||||||
FILE* file;
|
|
||||||
image_header h;
|
image_header h;
|
||||||
|
|
||||||
file = OPEN_WRITE(saving_filename);
|
|
||||||
if (file == NULL) {
|
|
||||||
std::cout << "Cannot open image file for writing: " << saving_filename << std::endl;
|
|
||||||
char *msg = threadsafe_strerror(errno);
|
|
||||||
std::cout << "strerror:3: " << msg << std::endl;
|
|
||||||
free(msg);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
h.magic = image_magic;
|
h.magic = image_magic;
|
||||||
h.version = image_version;
|
h.version = image_version;
|
||||||
h.data_relocation_base = data->tenured->start;
|
h.data_relocation_base = data->tenured->start;
|
||||||
|
@ -226,26 +216,26 @@ bool factor_vm::save_image(const vm_char* saving_filename,
|
||||||
h.special_objects[i] =
|
h.special_objects[i] =
|
||||||
(save_special_p(i) ? special_objects[i] : false_object);
|
(save_special_p(i) ? special_objects[i] : false_object);
|
||||||
|
|
||||||
bool ok = true;
|
FILE* file = OPEN_WRITE(saving_filename);
|
||||||
|
if (file == NULL)
|
||||||
|
goto error;
|
||||||
if (safe_fwrite(&h, sizeof(image_header), 1, file) != 1)
|
if (safe_fwrite(&h, sizeof(image_header), 1, file) != 1)
|
||||||
ok = false;
|
goto error;
|
||||||
if (safe_fwrite((void*)data->tenured->start, h.data_size, 1, file) != 1)
|
if (safe_fwrite((void*)data->tenured->start, h.data_size, 1, file) != 1)
|
||||||
ok = false;
|
goto error;
|
||||||
if (safe_fwrite((void*)code->allocator->start, h.code_size, 1, file) != 1)
|
if (safe_fwrite((void*)code->allocator->start, h.code_size, 1, file) != 1)
|
||||||
ok = false;
|
goto error;
|
||||||
safe_fclose(file);
|
safe_fclose(file);
|
||||||
|
move_file(saving_filename, filename);
|
||||||
|
return true;
|
||||||
|
|
||||||
if (!ok) {
|
error:
|
||||||
std::cout << "save-image failed." << std::endl;
|
std::cout << "save_image failed." << std::endl;
|
||||||
char *msg = threadsafe_strerror(errno);
|
char *msg = threadsafe_strerror(errno);
|
||||||
std::cout << "strerror:4: " << msg << std::endl;
|
std::cout << "strerror:4: " << msg << std::endl;
|
||||||
free(msg);
|
free(msg);
|
||||||
}
|
return false;
|
||||||
else
|
|
||||||
move_file(saving_filename, filename);
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocates memory */
|
/* Allocates memory */
|
||||||
|
|
Loading…
Reference in New Issue